Archive for the ‘LaTeX’ Category.

PDF-Formulare mit dem hyperref Paket erstellen

Hier ein einfaches Beispiel, wie man PDF-Formulare mit dem hyperref Paket erstellen kann.

\documentclass{article}
 
% Load hyperref with form support
\usepackage{hyperref}
 
\hypersetup{
  pdfauthor={Your Name},
  pdftitle={Sample Fillable PDF Form},
  pdfcreator={LaTeX with hyperref}
}
 
\begin{document}
 
\section*{Beispielformular}
 
Bitte ausfüllen!
 
\vspace{1em}
 
\noindent
\textbf{Name:}\\[0.5em]
\TextField[
  name=name,
  width=0.8\linewidth,
  bordercolor={0 0 0}
]{}
 
\vspace{1em}
 
\noindent
\textbf{E-Mail:}\\[0.5em]
\TextField[
  name=email,
  width=0.8\linewidth,
  bordercolor={0 0 0}
]{}
 
\vspace{1em}
 
\noindent
\textbf{Alter:}\\[0.5em]
\TextField[
  name=age,
  width=4cm]{}
 
\vspace{1em}
 
\noindent
\textbf{Lieblingsfrucht:}\\[0.5em]
\ChoiceMenu[
  name=gender,
  width=4cm,
  combo
]{Wählen einen Eintrag: }{Apfel,Birne,Kirsche}
 
\vspace{1em}
 
\noindent
\textbf{Newletter abonnieren?}\\[0.5em]
\CheckBox[name=subscribe]{} Ja
 
\vspace{1.5em}
 
\noindent
\textbf{Anmerkungen:}\\[0.5em]
\TextField[
  name=comments,
  width=\linewidth,
  height=3cm,
  multiline=true
]{}
 
\vspace{1.5em}
 
\noindent\PushButton[
  name=print,
  onclick={this.print({bUI:true,bSilent:false,bShrinkToFit:true});},
  bordercolor={0 0 0},
  width=4cm,
  height=1cm
]{Print Form}
 
\end{document}

PDF Dateien pixelbasiert miteinander vergleichen

Ausgehend von einer Anfrage auf der Dante Beraterkreis Mailingliste hier einige Ideen, wie man pixelbasiert PDF-Dateien miteinander vergleichen kann.

Schritt 1: Umwandlung ins PNG Format. Ich nutze dazu pdftoppm aus dem Poppler-Paket.


pdftoppm -png 1.pdf > 1.png

das gleiche dann nochmal für die zweite Datei.

Dann mit ein wenig Python-Magie die beiden PNGs vergleichen:

 
from PIL import Image, ImageChops # generic
import numpy as np # numerical
from skimage.metrics import structural_similarity as ssim
import cv2
 
# Load the images
img1 = Image.open("1.png")
img2 = Image.open("2.png")
 
# Compute absolute difference
diff = ImageChops.difference(img1, img2)
 
# Save or show the difference image
diff.save("difference.png")
diff.show()
 
 
# Load PNGs into numpy arrays
img1 = np.array(Image.open("1.png"))
img2 = np.array(Image.open("2.png"))
 
# Compute pixel-wise absolute difference
diff = np.abs(img1.astype(int) - img2.astype(int))
 
# Save result
Image.fromarray(diff.astype(np.uint8)).save("difference.png")
# Or compute some stats:
print("Mean difference:", diff.mean())
print("Max difference:", diff.max())
 
 
# Convert to grayscale
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
 
score, diff = ssim(gray1, gray2, full=True)
print("SSIM:", score)
 
# diff is in [0,1]; scale to 0-255 to view as an image
diff = (diff * 255).astype("uint8")
cv2.imwrite("ssim_diff.png", diff)

Behringer Abacus / Mutuable Instruments Maths in TikZ

Hier ein Versuch, ein Maths bzw. Abacus Eurorack Modul mit TikZ zu zeichnen.

%!TEX TS-program = pdflatex
\documentclass[12pt,ngerman,tikz]{standalone}
 
\begin{document}
\begin{tikzpicture}[red,draw=red, fill=red]
 
% a plug
\newcommand{\plug}[2]{% three circles, inner one is filled
    \fill (#1,#2) circle (0.1875cm);
    \draw (#1,#2) circle (0.28cm);
    \draw (#1,#2) circle (0.42cm);
}
 
% buttons
\newcommand{\button}[2]{% three circles, inner one is filled
    \fill (#1,#2) circle (0.5cm);
    \fill[white] (#1,#2) circle (0.4cm);
}
 
% a plug with a label above
\newcommand{\labelplug}[3]{%
    \fill (#1,#2) circle (0.1875cm);
    \draw (#1,#2) circle (0.28cm);
    \draw (#1,#2) circle (0.42cm);
    \node[above=0.35cm,font=\sffamily\bfseries\scriptsize] at (#1,+#2) {#3};
}
 
%  \knob{x}{y}{size}{angle} 
\newcommand{\knob}[4]{%
  \pgfmathsetmacro{\radius}{#3}%
  \pgfmathsetmacro{\reduced}{\radius * 0.8}%
  \pgfmathsetmacro{\tikzAngle}{90 - #4}%
  \draw[thick, fill=white!30] (#1,#2) circle (\radius cm);
  \draw[line width=2pt, red] (#1,#2) -- ++(\tikzAngle:\reduced cm);
}
 
% plug with label and led, in a frame
\newcommand{\labelplugled}[3]{%
    \fill (#1,#2) circle (0.1875cm);
    \draw (#1,#2) circle (0.28cm);
    \draw (#1,#2) circle (0.42cm);
    \node[above=0.35cm,font=\sffamily\bfseries\scriptsize] at (#1,#2) {#3};
     \draw[rounded corners=2pt]
      (#1-0.5, #2-0.5)
        rectangle
      (#1+0.5, {#2+1.2});
    \draw (#1,#2+0.945) circle (0.1cm);
}
 
% plug with label but no led, in a frame
\newcommand{\labelplugnoled}[3]{%
    \fill (#1,#2) circle (0.1875cm);
    \draw (#1,#2) circle (0.28cm);
    \draw (#1,#2) circle (0.42cm);
    \node[above=0.35cm,font=\sffamily\bfseries\scriptsize] at (#1,#2) {#3};
     \draw[rounded corners=2pt]
      (#1-0.5, #2-0.5)
        rectangle
      (#1+0.5, {#2+1.2});
 
}
 
% Screenshot from the manual, in the background
%\node[anchor=north west ,inner sep=0] (frame1) at (1,13)    {\includegraphics[width=10cm]{2025-09-20 04 09 06.png}};
 
% grid
\draw[help lines,red] (0,0) grid (13,14);
 
\draw[very thick, rounded corners=2pt](1,0.35) rectangle (11,13);
 
\labelplug{1.75}{11.5}{IN 1};
\labelplug{2.85}{11.5}{TRIG 1};
 
\labelplug{5.45}{11.5}{IN 2};
\labelplug{6.55}{11.5}{IN 3};
 
\labelplug{9.175}{11.5}{TRIG 4};
\labelplug{10.25}{11.5}{IN 4};
 
\plug{1.75}{10.2};
\plug{1.75}{9};
\plug{1.75}{7.9};
\plug{1.75}{6.55};
 
\plug{10.25}{10.2};
\plug{10.25}{9};
\plug{10.25}{7.9};
\plug{10.25}{6.55};
 
 
\labelplugled{1.75}{1.8}{EOR};
\labelplugled{2.9}{1.8}{$\smallint$};
 
\labelplugnoled{4.9}{1.8}{OR};
\labelplugled{6}{1.8}{SUM};
\labelplugnoled{7.1}{1.8}{INV};
 
\labelplugled{9.14}{1.8}{$\smallint$};
\labelplugled{10.25}{1.8}{EOC};
 
\labelplugnoled{4.25}{3.6}{OUT 1};
\labelplugnoled{5.4}{3.6}{OUT 2};
\labelplugnoled{6.55}{3.6}{OUT 3};
\labelplugnoled{7.7}{3.6}{OUT 4};
 
\knob{3.5}{10.2}{0.7}{0}
\knob{8.5}{10.2}{0.7}{0}
 
\knob{3.5}{7.9}{0.7}{0}
\knob{8.5}{7.9}{0.7}{0}
 
\knob{3.5}{5.7}{0.7}{0}
\knob{8.5}{5.7}{0.7}{0}
 
\knob{5}{9}{0.35}{0}
\knob{7}{9}{0.35}{0}
\knob{5}{6.75}{0.35}{0}
\knob{7}{6.75}{0.35}{0}
 
\button{2.3}{4.15}
\button{9.7}{4.15}
 
\node at (5,9.6){\sffamily\bfseries\footnotesize1};
\node at (7,9.6){\sffamily\bfseries\footnotesize4};
\node at (5,7.35){\sffamily\bfseries\footnotesize2};
\node at (7,7.35){\sffamily\bfseries\footnotesize4};
 
\node at (4.75,8.5){\sffamily\bfseries--};
\node at (5.3,8.5){\sffamily\bfseries+};
\node at (4.75,6.25){\sffamily\bfseries--};
\node at (5.3,6.25){\sffamily\bfseries+};
 
\node at (6.75,8.5){\sffamily\bfseries--};
\node at (7.3,8.5){\sffamily\bfseries+};
\node at (6.75,6.25){\sffamily\bfseries--};
\node at (7.3,6.25){\sffamily\bfseries+};
 
 
\draw[very thick] (3.4,11.5) -- (3.95,11.5) -- (5,10.5) -- (5,9.8);
\draw[very thick] (8.7,11.5) -- (8.1,11.5) -- (7,10.5) -- (7,9.8);
 
\draw[very thick] (5.45,10.85) -- (5.7,10.6) -- (5.7,7.5) -- (5.3,7.1);
\draw[very thick] (6.55,10.85) -- (6.3,10.6) -- (6.3,7.5) -- (6.7,7.1);
 
\foreach \x in {0,1,2,3,4,5,6,7,8,9,10,11,12} {
\node(a) at (\x,-0.5){\x};}
 
\foreach \y in {0,1,2,3,4,5,6,7,8,9,10,11,12,13} {
\node(a) at (0.5,\y){\y};}
 
\end{tikzpicture}
\end{document}

abacus_tikz

ISO 3864, 7010 und 7001 Zeichen mit LaTeX setzen

Mit dem isosigns Paket kann man in LaTeX Zeichen aus den ISO Standards 3864, 7010 und 7001 setzen.

Link zur Doku: https://ctan.org/pkg/isosigns

Hier ein Screenshot aus der Dokumentation:

Drumpatterns mit TikZ zeichnen

Hier ein wenig TikZ-Code, um Drumpatterns für einen Drumcomputer mit TikZ zu zeichnen. Das Beispiel ist für eine Spur, es lassen sich aber beliebig viele Spuren untereinandersetzen.

%!TEX TS-program = Arara
% arara: lualatex: {shell: no}
\documentclass{scrartcl}
\usepackage[margin=1cm]{geometry}
\usepackage{tikz}
 
\begin{document}
 
\begin{tikzpicture}
    % Define the pattern as a comma-separated list
    \def\pattern{x,-,x,x,-,x,x,-,-,-,x,x,-,-,-,x}
    \def\cellsizex{1cm}
    \def\cellsizey{0.5cm}
 
    %\draw (0,0) rectangle ++ (\cellsizex-1, \cellsizey);
    \node[draw, rectangle,minimum width = \cellsizex, align=left,minimum height=\cellsizey] (a) at (\cellsizex/2,\cellsizey/2){1}; 
 
    % Loop through each character in the pattern
    \foreach \cell [count=\index from 1] in \pattern {
        % If 'x' fill the cell, otherwise leave it empty
        \if\cell x
            \fill[gray,draw=black] ({\index*\cellsizex}, 0) rectangle ++(\cellsizex, \cellsizey);
        \else
            \draw ({\index*\cellsizex}, 0) rectangle ++(\cellsizex, \cellsizey);
        \fi
    }
\end{tikzpicture}
 
\end{document}

drumbrute_pattern2.pdf

„Unscharfe“ Kreise mit TikZ

Ausgehend von einer Frage im LaTeX Reddit-Forum hier die Antwort, wie man mit Tikz „unscharfe“ Kreise zeichnen kann.

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{tikz}
 
\begin{document}
 
\begin{tikzpicture}
\shade[inner color = gray, outer color = white] (0,0) circle [radius = 1];
\end{tikzpicture}
 
\end{document}

Ulam Spiralen mit TikZ und Lualatex

Hier der preprint meines neuen Artikels für die TeXnische Komödie.

UweZiegenhagen-Ulam.pdf

ulam_500.pdf (16 MB)

Mit einer Batch-Datei alle PDF Dateien nach PNG umwandeln

Mit dem folgenden Skript kann man alle PDFs eines Verzeichnisses nach PNG wandeln. Poppler muss dazu installiert und im Pfad sein.


@echo off
setlocal enabledelayedexpansion

REM Set the output image format (e.g., png, jpeg, or ppm)
set FORMAT=png

REM Loop through all PDF files in the current directory
for %%F in (pg*.pdf) do (
echo Converting %%F...
pdftoppm -%FORMAT% "%%F" "%%~nF"
)

echo Done!
pause

Iso-Papier mit LaTeX und dem gridpapers Paket

Hier ein Beispiel aus der gridpapers Doku, wie man mit LaTeX isometrische Papiere gestalten kann.

\documentclass{article}
\usepackage[pattern=iso, %tri für senkrecht
patternsize=0.5cm,
textarea,
bgcolor=white,
%majorcolor={green},
minorcolor={lightgray},
geometry={a4paper, margin=1cm}]{gridpapers}
\begin{document}
\thispagestyle{empty}
~
\end{document}

gridpapers-iso

gridpapers-tri

Drum Patterns mit LaTeX

Hier ein erster Entwurf, wie man mit LaTeX Drum Patters setzen kann.

\documentclass[12pt,ngerman]{scrartcl}
\usepackage[margin=1cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{tikz}
 
\begin{document}
 
\begin{tikzpicture}
    % Define the pattern as a comma-separated list
    \def\pattern{x,-,-,-,-,x,x,-,-,-,x,x,-,-,-,x}
    \def\cellsizex{1cm}
    \def\cellsizey{0.5cm}
 
    \node[draw, rectangle,minimum width = \cellsizex, align=left,minimum height=\cellsizey] (a) at (\cellsizex/2,\cellsizey/2){\tiny 1}; 
 
    % Loop through each character in the pattern
    \foreach \cell [count=\index from 1] in \pattern {
        % If 'x' fill the cell, otherwise leave it empty
        \if\cell x
            \fill[gray,draw=black] ({\index*\cellsizex}, 0) rectangle ++(\cellsizex, \cellsizey);
        \else
            \draw ({\index*\cellsizex}, 0) rectangle ++(\cellsizex, \cellsizey);
        \fi
    }
\end{tikzpicture}

drumbrute_pattern