Compare commits

...

10 commits

Author SHA1 Message Date
nobody 9c31d0df92 mehr doku 2025-01-14 23:56:10 +01:00
nobody 3aa389f680 some rewriting 2025-01-08 00:14:18 +01:00
nobody b0dd3ad1ef exakte Pakete angeben 2024-12-20 01:08:04 +01:00
nobody 6ad266b3c6 fold markers 2024-12-19 16:48:15 +01:00
nobody 2f71b5589d Inline-Textfeld 2024-12-19 07:09:57 +01:00
nobody 24f42ab403 fix multiline fields 2024-12-19 05:29:39 +01:00
nobody 53a83d838b noise / torn paper experiments 2024-12-18 19:27:32 +01:00
nobody 6475efca6c progress 2024-12-13 06:03:07 +01:00
nobody 0ab08f7b83 partial conversion to scrreprt 2024-12-13 00:20:59 +01:00
nobody 1aaadbe896 fixes 2024-12-12 19:26:10 +01:00
5 changed files with 541 additions and 177 deletions

2
.gitignore vendored
View file

@ -1,9 +1,11 @@
*.aux *.aux
*.auxlock
*.hd *.hd
*.log *.log
*.out *.out
*.toc *.toc
*.pdf *.pdf
*.pyg
_minted-* _minted-*
cccbform-examples cccbform-examples
*.fdb_latexmk *.fdb_latexmk

View file

@ -12,7 +12,7 @@ clean:
distclean: distclean:
latexmk -C latexmk -C
rm -fr _minted-doku cccbform-examples doku.hd rm -fr _minted-doku cccbform-examples doku.hd doku.auxlock doku.pyg
doku.pdf: doku.tex cccbform.cls logo.pdf doku.pdf: doku.tex cccbform.cls logo.pdf
latexmk -g -pdflua -lualatex="lualatex --shell-escape %O %S" $< latexmk -g -pdflua -lualatex="lualatex --shell-escape %O %S" $<

View file

@ -2,8 +2,8 @@
\ProvidesClass{cccbform}[2024/12/08 In the Beginning, There Was Chaos] \ProvidesClass{cccbform}[2024/12/08 In the Beginning, There Was Chaos]
\LoadClass{scrartcl} \LoadClass{scrartcl}
\RequirePackage{geometry, calc, fontspec, tikz, hyperref, changepage, letltxmacro, csquotes}
\RequirePackage[ngerman]{babel} \RequirePackage[ngerman]{babel}
\RequirePackage{geometry, calc, fontspec, tikz, hyperref, changepage, letltxmacro, csquotes}
\MakeOuterQuote{"} \MakeOuterQuote{"}
\usetikzlibrary{calc} \usetikzlibrary{calc}
@ -259,7 +259,7 @@
% TextField*{label} - a single-line input (starred version uses all available space) % TextField*{label} - a single-line input (starred version uses all available space)
\RenewDocumentCommand{\TextField}{s m}{% \RenewDocumentCommand{\TextField}{s m}{%
\par% \par\addvspace{1.5\formskip}%
\ifMultiColumn% \ifMultiColumn%
\pgfmathsetmacro{\@tlen}{1.0}% \pgfmathsetmacro{\@tlen}{1.0}%
\else% \else%
@ -269,19 +269,19 @@
\fi% \fi%
\begin{tikzpicture}[baseline] \begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight); \useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight);
\node[anchor=west] at (0, 0) { \node[anchor=base west] at (0, 0) {
\full@TextField[\@tlen] \full@TextField[\@tlen]
}; };
\node[anchor=west,rotate=\labelangle] at (-1em,0.4\formfieldheight) { \node[anchor=base west,rotate=\labelangle] at (-1em,0.6\formfieldheight) {
\ttfamily\footnotesize #2\strut \ttfamily\footnotesize #2\strut
}; };
\end{tikzpicture}% \end{tikzpicture}%
\par\addvspace{1.5\formskip}% \par\addvspace{\formskip}%
} }
% ShortTextField[width]{label} - a single-line input with reduced width % ShortTextField[width]{label} - a single-line input with reduced width
\NewDocumentCommand{\ShortTextField}{o m}{% \NewDocumentCommand{\ShortTextField}{o m}{%
\par% \par\addvspace{1.5\formskip}%
\IfValueTF{#1}{\pgfmathsetmacro{\@tlen}{#1}}{% \IfValueTF{#1}{\pgfmathsetmacro{\@tlen}{#1}}{%
\ifMultiColumn% \ifMultiColumn%
\pgfmathsetmacro{\@tlen}{\normalfieldwidth}% \pgfmathsetmacro{\@tlen}{\normalfieldwidth}%
@ -291,10 +291,10 @@
}% }%
\begin{tikzpicture}[baseline] \begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight); \useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight);
\node[anchor=west] at (0,0) { \node[anchor=base west] at (0,0) {
\full@TextField[\@tlen] \full@TextField[\@tlen]
}; };
\node[anchor=west,rotate=\labelangle] at (-1em,0.4\formfieldheight) { \node[anchor=base west,rotate=\labelangle] at (-1em,0.6\formfieldheight) {
\ttfamily\footnotesize #2\strut \ttfamily\footnotesize #2\strut
}; };
\end{tikzpicture}% \end{tikzpicture}%
@ -302,8 +302,8 @@
} }
% MultilineTextField*[height]{label} - a multi-line input, starred version uses all available width % MultilineTextField*[height]{label} - a multi-line input, starred version uses all available width
\NewDocumentCommand{\MultilineTextField}{s O{} m}{% \NewDocumentCommand{\MultilineTextField}{s O{\formfieldheight} m}{%
\par\addvspace{\formskip}% \par\addvspace{1.5\formskip}%
\ifMultiColumn% \ifMultiColumn%
\pgfmathsetmacro{\@tlen}{1.0}% \pgfmathsetmacro{\@tlen}{1.0}%
\else% \else%
@ -312,11 +312,11 @@
{\pgfmathsetmacro{\@tlen}{\normalfieldwidth}}% {\pgfmathsetmacro{\@tlen}{\normalfieldwidth}}%
\fi% \fi%
\begin{tikzpicture}[baseline] \begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight); \useasboundingbox (0,0) rectangle (\@tlen\textwidth, #2);
\node[anchor=west] at (0,0) { \node[anchor=base west] at (0,0) {
\full@MultilineTextField<#2>[\@tlen] \full@MultilineTextField<#2>[\@tlen]
}; };
\node[anchor=west,rotate=\labelangle] at (-1em,0.4\formfieldheight) { \node[anchor=base west,rotate=\labelangle] at (-1em,#2 - 0.4\formfieldheight) {
\ttfamily\footnotesize #3\strut \ttfamily\footnotesize #3\strut
}; };
\end{tikzpicture} \end{tikzpicture}
@ -325,7 +325,7 @@
% Signature[label] - a field not fillable on the computer, big enough for a signature % Signature[label] - a field not fillable on the computer, big enough for a signature
\NewDocumentCommand{\Signature}{O{Datum, Unterschrift}}{% \NewDocumentCommand{\Signature}{O{Datum, Unterschrift}}{%
\par\addvspace{\formskip}% \par\addvspace{2\formskip}%
\ifMultiColumn% \ifMultiColumn%
\pgfmathsetmacro{\@tlen}{\normalfieldwidth}% \pgfmathsetmacro{\@tlen}{\normalfieldwidth}%
\else% \else%
@ -333,32 +333,52 @@
\fi% \fi%
\begin{tikzpicture}[baseline] \begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,1.0cm); \useasboundingbox (0,0) rectangle (\@tlen\textwidth,1.0cm);
\node[anchor=west] at (0,0) { \node[anchor=base west] at (0,0) {
\fake@MultilineTextField<1.0cm>[\@tlen] \fake@MultilineTextField<1.0cm>[\@tlen]
}; };
\node[anchor=north west,rotate=\labelangle] at (-1em,1cm -0.4\formfieldheight) { \node[anchor=base west,rotate=\labelangle] at (-1em,1cm - 0.4\formfieldheight) {
\ttfamily\footnotesize #1\strut \ttfamily\footnotesize #1\strut
}; };
\end{tikzpicture} \end{tikzpicture}
\par\addvspace{2\formskip}% \par\addvspace{\formskip}%
} }
% Notes[label] - a slightly taller fake field that fills the whole width % Notes[label] - a slightly taller fake field that fills the whole width
\NewDocumentCommand{\Notes}{O{Vermerke}}{% \NewDocumentCommand{\Notes}{O{Vermerke}}{%
\par\addvspace{\formskip}% \par\addvspace{1.5\formskip}%
\pgfmathsetmacro{\@tlen}{1.0} \pgfmathsetmacro{\@tlen}{1.0}
\begin{tikzpicture}[baseline] \begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,1.5cm); \useasboundingbox (0,0) rectangle (\@tlen\textwidth,1.5cm);
\node[anchor=west] at (0,0) { \node[anchor=base west] at (0,0) {
\fake@MultilineTextField<1.5cm>[\@tlen] \fake@MultilineTextField<1.5cm>[\@tlen]
}; };
\node[anchor=north west,rotate=\labelangle] at (-1em,1.5cm -0.9\formfieldheight) { \node[anchor=base west,rotate=\labelangle] at (-1em,1.5cm - 0.4\formfieldheight) {
\ttfamily\footnotesize #1\strut \ttfamily\footnotesize #1\strut
}; };
\end{tikzpicture} \end{tikzpicture}
\par\addvspace{\formskip}% \par\addvspace{\formskip}%
} }
% InlineTextField[width]{label}
\NewDocumentCommand{\InlineTextField}{o m}{%
\IfValueTF{#1}%
{\pgfmathsetmacro{\@tlen}{#1}}%
{\ifMultiColumn%
\pgfmathsetmacro{\@tlen}{\normalfieldwidth}%
\else%
\pgfmathsetmacro{\@tlen}{\shortfieldwidth}%
\fi}%
\begin{tikzpicture}[baseline]
\useasboundingbox (0,0) rectangle (\@tlen\textwidth,\formfieldheight);
\node[anchor=base west] at (0,0) { \full@TextField[\@tlen] };
\IfBlankTF{#2}{}{
\node[anchor=base west, rotate=\labelangle] at (-1em,0.6\formfieldheight) {
\ttfamily\footnotesize #2\strut
};
}
\end{tikzpicture}
}
% Checkbox{label} - a checkbox; label can be long and will linebreak reasonably pretty % Checkbox{label} - a checkbox; label can be long and will linebreak reasonably pretty
\NewDocumentCommand{\Checkbox}{m}{% \NewDocumentCommand{\Checkbox}{m}{%
\par% \par%
@ -512,6 +532,9 @@
}% }%
} }
% ensure line height is enough to fit a form field
\NewDocumentCommand{\formstrut}{}{\rule{0pt}{\formfieldheight}\strut}
% % % common title patterns % % % common title patterns
% put the logo in the top right corner % put the logo in the top right corner

636
doku.tex
View file

@ -1,18 +1,27 @@
%% NB: Dieses Dokument baut so 3-10 Minuten je nach Dateisystem-Performance… %% NB: Dieses Dokument baut beim ersten Mal so 3-10 Minuten je nach
%% (Sehr viele Beispiele die jeweils komplette eigenständige Dokumente sind.) %% Dateisystem-Performance… (Sehr viele Beispiele die jeweils komplette
\documentclass[ngerman,10pt]{scrartcl} %% eigenständige Dokumente sind.) Danach sollte es gehen.
\usepackage{calc,tikz,minted,fontspec,luacode,csquotes,babel,hyperref,microtype} % header <<<
\MakeOuterQuote{"} \documentclass[ngerman,10pt]{scrreprt}
\setcounter{secnumdepth}{\subsubsectionnumdepth}
\setcounter{tocdepth}{\subsubsectiontocdepth}
\KOMAoptions{BCOR=1cm,DIV=10,open=any}
\usepackage{calc,tikz,minted,fontspec,luacode,babel,csquotes,hyperref}
\usetikzlibrary{calc}
\hypersetup{colorlinks,urlcolor={magenta!75!black},linkcolor={green!50!black}} \hypersetup{colorlinks,urlcolor={magenta!75!black},linkcolor={green!50!black}}
\linespread{1.05} \linespread{1.10}
% font definition (same as cccbform.cls) % font definition (same as cccbform.cls)
%% FIXME: [RawFeature +case] x [microtype] fixes
%% see https://github.com/schlcht/microtype/issues/33 for fix notes
%% see https://fontdrop.info/?darkmode=true for character lookup
% fonts <<<
\setmainfont[ \setmainfont[
Renderer=HarfBuzz, Renderer=HarfBuzz,
ItalicFont=Recursive, ItalicFont=Recursive,
BoldFont=Recursive, BoldFont=Recursive,
BoldItalicFont=Recursive, BoldItalicFont=Recursive,
UprightFeatures={ UprightFeatures={
RawFeature={+ss01,+ss02,+ss08,+case}, RawFeature={+ss01,+ss02,+ss08},
RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=400}} RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=400}}
}, },
BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}}, BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}},
@ -25,7 +34,7 @@
BoldFont=Recursive, BoldFont=Recursive,
BoldItalicFont=Recursive, BoldItalicFont=Recursive,
UprightFeatures={ UprightFeatures={
RawFeature={+ss01,+ss02,+ss08,+case}, RawFeature={+ss01,+ss02,+ss08},
RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=400}} RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=400}}
}, },
BoldFeatures={RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}}, BoldFeatures={RawFeature={+axis={MONO=1.0,CASL=0.2,slnt=0,CRSV=0,wght=700}}},
@ -38,18 +47,22 @@
BoldFont=Recursive, BoldFont=Recursive,
BoldItalicFont=Recursive, BoldItalicFont=Recursive,
UprightFeatures={ UprightFeatures={
RawFeature={+ss01,+ss02,+ss08,+case}, RawFeature={+ss01,+ss02,+ss08},
RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=500}} RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=500}}
}, },
BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=800}}}, BoldFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=0,CRSV=1,wght=800}}},
BoldItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=800}}}, BoldItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=800}}},
ItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=500}}} ItalicFeatures={RawFeature={+axis={MONO=0.0,CASL=0.4,slnt=-15,CRSV=1,wght=500}}}
]{Recursive} ]{Recursive}
\setkomafont{disposition}{\titlefont}
% >>>
\usepackage{microtype}
% embedded examples <<<
% set up example build directory % set up example build directory
\directlua{ os.execute "mkdir -p cccbform-examples" } \directlua{ os.execute "mkdir -p ./cccbform-examples/" }
\directlua{ os.execute "cp cccbform.cls cccbform-examples/" } \directlua{ os.execute "cp cccbform.cls logo.pdf cccbform-examples/" }
\directlua{ os.execute "cp logo.pdf cccbform-examples/" }
% stuff to add before/after examples to form a full document % stuff to add before/after examples to form a full document
\begin{luacode*} \begin{luacode*}
HEADER1 = [[ HEADER1 = [[
@ -63,6 +76,85 @@ FOOTER = [[
]] ]]
\end{luacode*} \end{luacode*}
% crinkly paper tears <<<
\begin{luacode*}
-- PARAM: number of layers, resulting in 2^LAYERS points
local LAYERS = 7
-- PARAM: per layer, multiply component by (1/(2^K))^weight
-- (1 = default, larger = smoother, smaller = rougher)
local weight = 1.00
N = 1 << LAYERS
function smoothstep( a, b, t )
local t = t*t*(3-2*t)
return a + (b-a)*t
end
function REFRESH_POINTS()
POINTS = { }
for i = 1, N do
POINTS[i] = (2*math.random()-1)/N^weight -- + 0.125*math.sin( 2*math.pi*i/N )
end
for l = 2, LAYERS-1 do
local K = 1<<l
local len = N//K
local RNG = { }
for i = 1, K do RNG[i] = 2*math.random()-1 end
RNG[0] = RNG[K]
for seg = 1, K do
local lseg, rseg = (seg-1)*len, seg*len
local lRNG, rRNG = RNG[seg-1], RNG[seg]
for j = lseg+1, rseg do
local t = (j-lseg)/len
POINTS[j] = POINTS[j] + smoothstep(lRNG, rRNG, t)/K^weight
end
end
end
POINTS[0] = POINTS[N]
end
function getPoints()
REFRESH_POINTS()
local buf = { }
for i = 0, #POINTS do buf[i+1] = ("%.4fcm"):format( POINTS[i]/4 ) end
buf = table.concat( buf, ", " )
tex.print( [[\def\perturbationPoints{ ]]..buf.." }" )
tex.print( [[\def\numPoints{ ]]..(#POINTS+1).." }" )
end
function plotPoints( x1, x2, y1, y2, smooth_top )
x1, x2 = tonumber( (x1:sub(1,-3)) ), tonumber( (x2:sub(1,-3)) )
y1, y2 = tonumber( (y1:sub(1,-3)) ), tonumber( (y2:sub(1,-3)) )
local dx = (x2-x1)/(N)
local buf = { }
local SCALE = 10
local P0 = 0
if smooth_top then
SCALE = SCALE * 2.5
buf[#buf+1] = ("(%.4fpt, %.4fpt)"):format( x1, y1 )
buf[#buf+1] = ("(%.4fpt, %.4fpt)"):format( x2, y1 )
else
REFRESH_POINTS()
for i = 0, #POINTS do
buf[#buf+1] = ("(%.4fpt, %.4fpt)"):format( x1 + i*dx, y1 + POINTS[i]*SCALE )
end
P0 = POINTS[0]
end
REFRESH_POINTS()
for i = #POINTS, 0, -1 do
buf[#buf+1] = ("(%.4fpt, %.4fpt)"):format( x1 + i*dx, y2 + POINTS[N-i]*SCALE )
end
buf[#buf+1] = ("(%.4fpt, %.4fpt)"):format( x1, y1 + P0*SCALE )
buf = table.concat( buf, " -- " )
tex.print( buf )
end
\end{luacode*}
% >>>
\begin{luacode*} \begin{luacode*}
function makeVerb( envname ) function makeVerb( envname )
local buf local buf
@ -109,11 +201,19 @@ FOOTER = [[
\directlua{ ShortExampleStart, ShortExampleEnd = makeVerb "ShortExample" } \directlua{ ShortExampleStart, ShortExampleEnd = makeVerb "ShortExample" }
\NewDocumentEnvironment{ShortExample}{O{} m m}{ \makeatletter
\newcommand{\gettikzxy}[3]{%
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\edef#2{\the\pgf@x}%
\edef#3{\the\pgf@y}%
}
\makeatother
\NewDocumentEnvironment{ShortExample}{s O{} m m}{
\addvspace{1em} \addvspace{1em}
\directlua{ShortExampleStart()} \directlua{ShortExampleStart()}
}{ }{
\directlua{ EndExample( ShortExampleEnd, "#1", "#2" ) } \directlua{ EndExample( ShortExampleEnd, "#2", "#3" ) }
\par\noindent \par\noindent
\null\hspace*{-2cm} \null\hspace*{-2cm}
\rlap{ \rlap{
@ -123,24 +223,33 @@ FOOTER = [[
\node[anchor=north east] (code) at (-0.5ex,0) { \node[anchor=north east] (code) at (-0.5ex,0) {
\begin{minipage}[t]{0.5\textwidth - 3ex} \begin{minipage}[t]{0.5\textwidth - 3ex}
\vspace{-2ex} \vspace{-2ex}
\inputminted[firstline=\ls,lastline=\lc]{tex}{cccbform-examples/#2.tex} \inputminted[firstline=\ls,lastline=\lc]{tex}{cccbform-examples/#3.tex}
\end{minipage} \end{minipage}
}; };
\node[anchor=north west, draw=black!50] (output) at (0.5ex,0) { \node[anchor=north west] (output) at (0.5ex,0) {
\begin{minipage}[t]{0.5\textwidth - 2ex} \begin{minipage}[t]{0.5\textwidth - 2ex}
\includegraphics[width=\linewidth]{cccbform-examples/#2.pdf} \includegraphics[width=\linewidth]{cccbform-examples/#3.pdf}
\end{minipage} \end{minipage}
}; };
\gettikzxy{(output.north west)}{\xl}{\yt}
\gettikzxy{(output.south east)}{\xr}{\yb}
\IfBooleanTF{#1}{
\draw \directlua{ plotPoints( "\xl", "\xr", "\yt", "\yb", true ) };
}{
\draw \directlua{ plotPoints( "\xl", "\xr", "\yt", "\yb", false ) };
}
\end{tikzpicture} \end{tikzpicture}
\par \par
\vspace{-2ex} \vspace{-2ex}
{\null\hfill\bfseries #3 \hfill\null} {\null\hfill\bfseries #4 \hfill\null}
\end{minipage} \end{minipage}
} }
\par \par
\addvspace{4ex} \addvspace{4ex}
} }
% XXX now unused… keep while things are in flux and just delete if we don't add
% complete examples
\NewDocumentEnvironment{StandaloneExample}{m}{ \NewDocumentEnvironment{StandaloneExample}{m}{
\VerbatimEnvironment% \VerbatimEnvironment%
\begin{VerbatimOut}{cccbform-examples/#1.tex}}% \begin{VerbatimOut}{cccbform-examples/#1.tex}}%
@ -165,30 +274,25 @@ FOOTER = [[
\end{tikzpicture} \end{tikzpicture}
} }
% >>>
\setminted{autogobble,bgcolor=black!10,frame=lines,framesep=1ex,tabsize=4,fontsize=\small} \setminted{autogobble,bgcolor=black!10,frame=lines,framesep=1ex,tabsize=4,fontsize=\small}
\setmintedinline{frame=none,framesep=0pt,fontsize=\small} % bgcolorvphantom is too new
\setmintedinline{frame=none,framesep=0pt,fontsize=\footnotesize}
\newmintinline[texcode]{tex}{} \newmintinline[texcode]{tex}{}
\sloppy \sloppy
\raggedbottom \raggedbottom
\title{\texttt{cccbform} -- Formulare für den CCCB} \MakeOuterQuote{"}
\title{\texttt{cccbform} Formulare für den CCCB}
\author{Frank Nord} \author{Frank Nord}
\begin{document} \begin{document}
\maketitle \maketitle
\tableofcontents \tableofcontents
% >>>
\section{TODO} \chapter{Übersicht} % <<<
\begin{itemize}
\item csquotes / MakeOuterQuote in cls
\item mehr \texttt{\textbackslash mintinline}
\item Inline-Textfeld
\item Grundsätze des aktuellen Designs
\item Bug: Höhe Multiline-Textfeld in example
\end{itemize}
\section{Übersicht}
Die Grundstruktur für Formulare ist folgende: Die Grundstruktur für Formulare ist folgende:
@ -210,39 +314,119 @@ Dieses Dokument gibt eine Übersicht über alles, was hilfreich sein könnte.
Allein schon existierende Formulare anzusehen oder zu kopieren und anzupassen Allein schon existierende Formulare anzusehen oder zu kopieren und anzupassen
sollte jedoch für die meisten Zwecke ausreichen. sollte jedoch für die meisten Zwecke ausreichen.
\subsection{Für \TeX-Neulinge} \section{Voraussetzungen} % <<<
Eine aktuelle \TeX-Distribution (auf den meisten Systemen vermutlich \TeX~Live)
inklusive ggf. dem \texttt{luatex}-Unterpaket, zusätzlich \texttt{latexmk} und
-- sofern noch nicht vorhanden -- \texttt{make} sollten auf der Programmseite
ausreichen.
Auf Debian heißen die konkreten Pakete:\\[1ex]
\null\hfill\begin{minipage}[t]{0.75\textwidth}
\texttt{make} \texttt{texlive} \texttt{texlive-pictures}
\texttt{texlive-latex-extra} \texttt{texlive-luatex}
\texttt{texlive-lang-german} \texttt{latexmk}
\end{minipage}\hfill\null\\[1ex]
auf anderen Systemen heißen sie hoffentlich ähnlich\dots{} ansonsten: viel Spaß
beim Suchen!
Die verwendete Schrift heißt "Recursive" und kann auf
\url{https://recursive.design} oder Google Fonts gefunden werden. Wir brauchen
nur die "Variable Font", die entweder \texttt{*\_VF\_*}
oder \texttt{*-VariableFont\_*} heißt, alle anderen Einzelschriften sind
unnötig.\footnote{Direktlink auf GitHub (ohne Gewähr):
\url{https://github.com/arrowtype/recursive/raw/refs/heads/main/fonts/ArrowType-Recursive-1.085/Recursive_Desktop/Recursive_VF_1.085.ttf}}
Die Schrift muss an einem Ort installiert werden, wo die
\texttt{luatex}-Font-Suche sie findet -- die meisten Standard-Ordner sollten
funktionieren, z.~B. auch \texttt{\$\{HOME\}/.local/share/fonts}.
% >>>
\section{Für \TeX-Neulinge} % <<<
Das meiste sollte auch ohne \TeX-Kenntnisse gehen, es gibt jedoch eine Reihe Das meiste sollte auch ohne \TeX-Kenntnisse gehen, es gibt jedoch eine Reihe
von Sonderzeichen, die besondere Bedeutung haben. Als eines der wichtigeren von Sonderzeichen, die besondere Bedeutung haben. Als eines der wichtigeren
beginnt \texcode|%| einen Zeilenkommentar. Bei den meisten Symbolen beginnt \texcode|%| einen Zeilenkommentar. Bei den meisten Symbolen
reicht es, einen Backslash (\texttt{\textbackslash}) davorzusetzen, aber der reicht es, einen Backslash (\texttt{\textbackslash}) davorzusetzen, aber der
Backslash selbst wird z.~B. durch \mintinline{tex}{\textbackslash} und nicht Backslash selbst wird z.~B. durch \texcode{\textbackslash} und nicht
\texcode{\\} erzeugt. Bei Unsicherheit hilft auch \texcode{\\} erzeugt. Bei Unsicherheit hilft auch
\url{http://detexify.kirelabs.org/classify.html}. (Dort kann man \url{http://detexify.kirelabs.org/classify.html}. (Dort kann man
Symbole malen und bekommt eine Liste möglicher Übereinstimmungen und wie man Symbole malen und bekommt eine Liste möglicher Übereinstimmungen und wie man
diese jeweils erzeugt. Das Symbol sollte generell ohne diese jeweils erzeugt. Das Symbol sollte generell ohne
\texttt{\textbackslash usepackage} auskommen und im \texttt{textmode} \texttt{\textbackslash usepackage} auskommen und im \texttt{textmode}
funktionieren -- diese Infos stehen ggf. über/unter dem Zeichen.) funktionieren -- diese Infos stehen ggf. über/unter dem Zeichen.)
Zu Leerzeichen und Zeilenumbrüchen noch folgendes: Einfache Zeilenumbrüche \subsection{Leerzeichen \& Umbrüche} % <<<
werden von \TeX{} generell ignoriert bzw. wie ein Leerzeichen zwischen Worten
behandelt. Eine leere Zeile (also (mindestens) zwei aufeinanderfolgende
Zeilenumbrüche) beginnt einen neuen Absatz. (Das geht auch mit
\mintinline{tex}{\par}.) \mintinline{tex}{\\} ist ein "einfacher"
Zeilenumbruch in der Ausgabe (ohne den Absatz zu beenden), der hier aber
möglichst vermieden werden sollte. Ein oder mehrere Leerzeichen werden wie ein
einzelnes Leerzeichen gelesen, erlauben aber generell Zeilenumbrüche wenn die
Zeile voll ist. \mintinline{tex}{~} erzeugt geschützte Leerzeichen, die nicht
umbrechen dürfen (und z.~B. bei Abkürzungen (\mintinline{tex}{z.~B.}) oder
Zahlen mit Einheiten verwendet werden sollten.) Nach Befehlen
(\mintinline{tex}{\foo}) werden (beliebig viele) Leerzeichen generell als
Token-Trenner ignoriert und entfernt (\mintinline{tex}{\TeX test} = \TeX test),
ein Verdoppeln des Leerzeichen bringt ebenfalls nichts. Stattdessen kann man
entweder leere Argumente angeben (\mintinline{tex}{\TeX{} test} = \TeX{} test)
oder das Leerzeichen ebenfalls mit einem Backslash schützen
(\mintinline{tex}{\TeX\ test} = \TeX\ test.)
\section{Klassen-Optionen} Zu Leerzeichen und Zeilenumbrüchen noch folgendes: \emph{Einfache
Zeilenumbrüche} werden wie in Markdown und anderen Formaten als einfaches
Leerzeichen interpretiert und \emph{nicht} als Umbruch. Separate Absätze
werden erzeugt, wenn mindestens zwei Zeilenumbrüche aufeinander folgen (d.~h.
auch im Text visuell eine Lücke entsteht), alternativ auch mit dem
\texcode{\par}-Makro. Einen Zeilenumbruch innerhalb eines Absatzes erzeugt man
mit \texcode{\\}, das ist aber meistens das falsche Werkzeug.
Ein oder mehrere Leerzeichen werden wie ein einzelnes Leerzeichen gelesen,
erlauben aber generell Zeilenumbrüche wenn die Zeile voll ist.
\texcode{~} erzeugt geschützte Leerzeichen, die nicht umbrechen dürfen
(und z.~B. bei Abkürzungen (\texcode{z.~B.}) oder Zahlen mit Einheiten
verwendet werden sollten.)
Nach Befehlen (\texcode{\foo}) werden (beliebig viele) Leerzeichen
generell als Token-Trenner ignoriert und entfernt (\texcode{\TeX test}
= \TeX test), ein Verdoppeln des Leerzeichen bringt ebenfalls nichts.
Stattdessen kann man entweder leere Argumente angeben
(\texcode{\TeX{} test} = \TeX{} test) oder das Leerzeichen ebenfalls mit einem
Backslash schützen (\texcode{\TeX\ test} = \TeX\ test.)
% >>>
\subsection{Befehlsstruktur} % <<<
\TeX\ ist eine sehr flexible Makro-Sprache, aber sowohl \LaTeX\ als auch diese
Klasse geben sich Mühe, das meiste davon zu verstecken und sehr einheitliche
Struktur vorzugeben. Befehlsaufrufe haben hier generell die Form
\texcode{\Befehl{Arg1}{Arg2}...{ArgN}}, wobei Argumente in geschweiften
Klammern immer angegeben werden müssen. Einige Befehle akzeptieren auch
\emph{optionale Argumente}, welche als Konvention eckige Klammern benutzen --
diese können entweder angegeben oder komplett weggelassen werden
(\texcode{\Foo{Baz}} oder \texcode{\Foo[Bar]{Baz}}.)
Zusätzlich gibt es manchmal auch "gesternte" Varianten, wo ein \texttt{*}
unmittelbar auf den Namen folgt (\texcode{\Fnord{23}} oder
\texcode{\Fnord*{23}}.) Konzeptuell ist das ein optionales
true/false-Argument, nur mit anderer Schreibweise.
% >>>
\subsection{Erzeugen von PDFs} % <<<
Sind alle Tools installiert, so sollte ein \texttt{make} ausreichen. (Das
Makefile findet automatisch alle neuen \texttt{.tex}-Dateien.) Soll nur ein
einzelnes Dokument gebaut werden, so sollte \texttt{make foo.pdf} zu einem
\texttt{foo.tex} genau dieses eine Dokument bauen.
Wirklich \emph{alle} Dokumente zu bauen dürfte beim ersten Mal mehrere Minuten
dauern. (Diese Dokumentation hier enthält viele Beispiele, die tatsächlich
eigenständige Dokumente sind. Der Overhead für alle je 2× \texttt{lualatex} zu
starten, mehrere temporäre Dateien zu schreiben, etc. etc. kann gut 3--10
Minuten fressen.) Danach erkennen \texttt{make} bzw. \texttt{latexmk}, dass
sich in den meisten Dateien nichts verändert hat und es geht bei zukünftigen
Durchläufen deutlich schneller (solange nicht die Klasse verändert wird -- was
wieder alles neu bauen würde -- braucht das wenige Sekunden bis ca. eine
Minute.)
% >>>
% >>>
% >>>
\chapter{Befehle} % <<<
Bereitgestellte Befehle fallen grob in 4 Kategorien -- Titel, Inhalt, Struktur,
Hervorhebung. Zusätzlich hat die Klasse selbst ein paar Optionen.
\section{Klassen-Optionen} % <<<
PDF-Formulare haben eine ganze Reihe von Problemen. Das wichtigste ist, dass PDF-Formulare haben eine ganze Reihe von Problemen. Das wichtigste ist, dass
viele Viewer PDF-Formulare nicht mitdrucken. Die Elemente wie sie hier erzeugt viele Viewer PDF-Formulare nicht mitdrucken. Die Elemente wie sie hier erzeugt
@ -253,55 +437,71 @@ drucken die Elemente mit, was dann wiederum anders komisch aussehen kann\dots
\subsection{\texttt{noform}} \subsection{\texttt{noform}}
Wird das Dokument also stattdessen mit Wird das Dokument also stattdessen mit
\mintinline{tex}|\documentclass[noform]{cccbform}| begonnen, werden keine \texcode|\documentclass[noform]{cccbform}| begonnen, werden keine
PDF-Formular-Felder erzeugt sondern nur die "falschen" als Bilder erzeugt. Das PDF-Formular-Felder erzeugt sondern nur die "falschen" als Bilder erzeugt. Das
stellt sicher, dass reine Druckvorlagen (die eh nicht ausgefüllt werden sollen) stellt sicher, dass reine Druckvorlagen (die eh nicht ausgefüllt werden sollen)
mit allen Viewern fehlerfrei gedruckt werden können. mit allen Viewern fehlerfrei gedruckt werden können.
\section{Struktur} \subsection{\texttt{example} und \texttt{shortexample}}
Bereitgestellte Befehle fallen grob in 4 Kategorien -- Titel, Inhalt, Struktur, Hervorhebung. Diese sind lediglich für Beispiele -- wie hier in dieser Doku -- gedacht.
\texttt{example} wählt A6 als Format aus, reduziert die Ränder auf fast nichts,
und passt ein paar Befehle an das kleinere Format an. \texttt{shortexample}
macht das gleiche, berechnet aber am Ende die tatsächliche Höhe und verkürzt
das ausgegebene Dokument. Fast alle Beispiele hier sind
\texttt{[shortexample]}s.
\subsection{Titel} % >>>
\section{Titel} % <<<
Aktuell gibt es zwei Arten von Titeln. In jedem Fall sollte genau einer und Aktuell gibt es zwei Arten von Titeln. In jedem Fall sollte genau einer und
unmittelbar in der Zeile hinter dem \texttt{\textbackslash begin\{document\}} unmittelbar in der Zeile hinter dem \texcode{\begin{document}} verwendet
verwendet werden. werden.
Bei langen Titeln ist ein manueller Zeilenumbruch Bei langen Titeln ist ein manueller Zeilenumbruch (\texcode{\\}) im Titel ggf.
(\texttt{\textbackslash\textbackslash}) im Titel ggf. sinnvoll, da der Text sinnvoll, da der Text sonst über das Logo bis zum Seitenrand laufen kann. (Das
sonst über das Logo bis zum Seitenrand laufen kann. (Das Logo und ggf. die Logo und ggf. die Adresse werden nachträglich platziert, \TeX\ "sieht" diese
Adresse werden nachträglich platziert, \TeX\ "sieht" diese also nicht beim also nicht beim verarbeiten des restlichen Inhalts.)
verarbeiten des restlichen Inhalts.)
\subsubsection{\texttt{\textbackslash LogoTitle\{Titel\}}} \subsection{\texcode{\LogoTitle{Titel}}} % <<<
\begin{ShortExample}[4.953cm]{logotitle}{Die einfache Variante -- Titel links, Logo rechts.} \begin{ShortExample}*[4.953cm]{logotitle}{Die einfache Variante -- Titel links, Logo rechts.}
\LogoTitle{Beispieltitel} \LogoTitle{Beispieltitel}
\Text{(...und hier geht's weiter.)} \Text{(...und hier geht's weiter.)}
\end{ShortExample} \end{ShortExample}
\subsubsection{\texttt{\textbackslash AddressTitle\{Titel\}}} % >>>
\begin{ShortExample}[8.865cm]{addresstitle}{Titel und Adresse} \subsection{\texcode{\AddressTitle{Titel}}} % <<<
\begin{ShortExample}*[8.865cm]{addresstitle}{Titel und Adresse}
\AddressTitle{Beispieltitel} \AddressTitle{Beispieltitel}
\Text{(...und hier geht's weiter.)} \Text{(...und hier geht's weiter.)}
\end{ShortExample} \end{ShortExample}
Es gibt auch die Variante mit \texttt{*}, welche zusätzlich das Logo einbettet. \filbreak
\subsubsection{\texcode{\AddressTitle*{Titel}}}
\begin{ShortExample}[8.865cm]{addresstitlestar}{Titel, Adresse und Logo} Es gibt auch die Variante mit \texttt{*}, welche zusätzlich das Logo einbettet.
\nopagebreak[2]
\begin{ShortExample}*[8.865cm]{addresstitlestar}{Titel, Adresse und Logo}
\AddressTitle*{Beispieltitel} \AddressTitle*{Beispieltitel}
\Text{(...und hier geht's weiter.)} \Text{(...und hier geht's weiter.)}
\end{ShortExample} \end{ShortExample}
\subsection{Inhalt} % >>>
% >>>
\section{Inhalt} % <<<
Hier gibt es größtenteils Befehle für Formularfelder. Anders als in normalen Hier gibt es größtenteils Befehle für Formularfelder. Anders als in normalen
\TeX-Dokumenten ist es hier jedoch wichtig, für korrekte Abstände \emph{allen} \TeX-Dokumenten ist es hier jedoch wichtig, für korrekte Abstände \emph{allen}
"losen" Text explizit als \texttt{\textbackslash Text} auszuzeichnen. Der "losen" Text explizit als \texcode{\Text} auszuzeichnen. Der Befehl kümmert
Befehl kümmert sich um korrekte Abstände, ohne diesen liegen Dinge zu eng sich um korrekte Abstände, ohne diesen liegen Dinge zu eng beieinander.
beieinander. Vergleiche: Vergleiche:
\begin{ShortExample}{textgood}{Text mit korrekten Abständen} \begin{ShortExample}{textgood}{Text mit korrekten Abständen}
\Text{Dieser Satz kein Verb.} \Text{Dieser Satz kein Verb.}
@ -315,8 +515,8 @@ Dieser Satz kein Verb.
Die blöden Ösen! Die blöden Ösen!
\end{ShortExample} \end{ShortExample}
Auch lange Texte mit mehreren Absätzen können in \texttt{\textbackslash Text} Auch lange Texte mit mehreren Absätzen können in \texcode{\Text} verwendet
verwendet werden. werden.
\begin{ShortExample}{textlong}{langer Text ist kein Problem} \begin{ShortExample}{textlong}{langer Text ist kein Problem}
\Text{ \Text{
@ -336,72 +536,77 @@ verwendet werden.
} }
\end{ShortExample} \end{ShortExample}
\subsubsection{Textfelder} \subsection{Textfelder} % <<<
Die vermutlich wichtigste Komponente, entsprechend viele Varianten gibt es. Die vermutlich wichtigste Komponente, entsprechend viele Varianten gibt es.
\paragraph{\texttt{\textbackslash TextField}} Im Zweifel ist die einfachste \subsubsection{\texcode{\TextField}} % <<<
Variante die richtige. Ein einzeiliges Freitextfeld mit Label und einer für
die meisten Zwecke angemessenen Breite (welche auch z.~B. in mehrspaltigen Im Zweifel ist die einfachste Variante die richtige: Ein einzeiliges
Bereichen von allein angepasst wird). Freitextfeld mit Label und einer für die meisten Zwecke angemessenen Breite
(welche auch z.~B. in mehrspaltigen Bereichen von allein angepasst wird).
\begin{ShortExample}{textfield}{normales Textfeld} \begin{ShortExample}{textfield}{normales Textfeld}
\TextField{Bezeichnung} \TextField{Bezeichnung}
\end{ShortExample} \end{ShortExample}
Wird die volle Breite benötigt gibt es auch die Variante mit Stern: \paragraph{\texcode{\TextField*}} Wird die volle Breite benötigt gibt es auch
die Variante mit Stern:
\begin{ShortExample}{textfieldstar}{maximale Breite} \begin{ShortExample}{textfieldstar}{maximale Breite}
\TextField*{Bezeichnung} \TextField*{Bezeichnung}
\end{ShortExample} \end{ShortExample}
\paragraph{\texttt{\textbackslash ShortTextField}} Wirkt die Breite hingegen zu % >>>
hoch (z.~B. für eine einzelne Zahl), so gibt es auch ein explizit kurzes Textfeld.
\subsubsection{\texcode{\ShortTextField}} % <<<
Wirkt die Breite hingegen zu hoch (z.~B. für eine einzelne Zahl), so gibt es
auch ein explizit kurzes Textfeld.
\begin{ShortExample}{shorttextfield}{kurzes Textfeld} \begin{ShortExample}{shorttextfield}{kurzes Textfeld}
\ShortTextField{Stromverbrauch (TWh)} \ShortTextField{Stromverbrauch (TWh)}
\end{ShortExample} \end{ShortExample}
Optional kann die Länge auch explizit als Faktor relativ zur Textbreite \paragraph{\texcode{\ShortTextField[width]}} Optional kann die Länge auch
angegeben werden. Das Formular sieht aber einheitlicher aus, wenn das explizit als Faktor relativ zur Textbreite angegeben werden. Das Formular
\emph{nicht} gemacht wird, also bitte zweimal überlegen, ob es das sieht aber einheitlicher aus, wenn das \emph{nicht} gemacht wird, also bitte
\emph{wirklich} braucht. zweimal überlegen, ob es das \emph{wirklich} braucht.
\begin{ShortExample}{shorttextfieldopt}{besonders kurzes Textfeld} \begin{ShortExample}{shorttextfieldopt}{besonders kurzes Textfeld}
\ShortTextField[0.15]{Verbrauch (TWh)} \ShortTextField[0.15]{Verbrauch (TWh)}
\end{ShortExample} \end{ShortExample}
\paragraph{\texttt{\textbackslash MultilineTextField}} Für mehr Text gibt es % >>>
auch mehrzeilige Textfelder. Auch wenn die Höhe technisch gesehen optional
ist, sollte sie immer angegeben werden -- ansonsten hat das Feld die \subsubsection{\texcode{\MultilineTextField}} % <<<
Standard-Höhe von normalen Textfeldern.
Für mehr Text gibt es auch mehrzeilige Textfelder. Auch wenn die Höhe
technisch gesehen optional ist, sollte sie immer angegeben werden -- ansonsten
hat das Feld die Standard-Höhe von normalen Textfeldern.
\begin{ShortExample}{multilinetextfield}{mehrzeiliges Textfeld} \begin{ShortExample}{multilinetextfield}{mehrzeiliges Textfeld}
%%% FIXME bug in preview (works in doc)
\Text{}
\MultilineTextField[2cm]{Kringel} \MultilineTextField[2cm]{Kringel}
\Text{}
\end{ShortExample} \end{ShortExample}
\begin{ShortExample}{multilinetextfieldbad}{einzeiliges mehrzeiliges Textfeld} \begin{ShortExample}{multilinetextfieldbad}{einzeiliges mehrzeiliges Textfeld}
%%% FIXME bug in preview (works in doc)
\Text{}
\MultilineTextField{Kringel} \MultilineTextField{Kringel}
\Text{}
\end{ShortExample} \end{ShortExample}
Auch hier gibt es wieder die Variante mit Stern für volle Breite: \paragraph{\texcode{\MultilineTextField*}} Auch hier gibt es wieder die
Variante mit Stern für volle Breite:
\begin{ShortExample}{multilinetextfieldstar}{breites mehrzeiliges Textfeld} \begin{ShortExample}{multilinetextfieldstar}{breites mehrzeiliges Textfeld}
%%% FIXME bug in preview (works in doc)
\Text{}
\MultilineTextField*[2cm]{Kringel} \MultilineTextField*[2cm]{Kringel}
\Text{}
\end{ShortExample} \end{ShortExample}
\paragraph{Spezialfälle} Unterschriften sollen üblicherweise händisch gesetzt % >>>
werden, hierfür gibt es daher ein Feld was nur ein "falsches" Formularfeld ist
und nicht digital ausgefüllt werden kann. \subsubsection{Spezialfälle} % <<<
Unterschriften sollen üblicherweise händisch gesetzt werden, hierfür gibt es
daher ein Feld was nur ein "falsches" Formularfeld ist und nicht digital
ausgefüllt werden kann.
(NB: Die Breite ist -- wie bei allem -- relativ zur Papierbreite definiert. Da (NB: Die Breite ist -- wie bei allem -- relativ zur Papierbreite definiert. Da
diese bei diesen Beispielen deutlich schmaler als A4 ist, sieht das Feld hier diese bei diesen Beispielen deutlich schmaler als A4 ist, sieht das Feld hier
@ -418,27 +623,80 @@ Das Label kann optional geändert werden.
\Signature[Unterschrift] \Signature[Unterschrift]
\end{ShortExample} \end{ShortExample}
Ebenfalls gibt es ein etwas größeres Feld für Notizen oder Vermerke. \paragraph{\texcode{\Notes}} Ebenfalls gibt es ein etwas größeres Feld für
Notizen oder Vermerke.
\begin{ShortExample}{notes}{großes Feld} \begin{ShortExample}{notes}{großes Feld}
%%% FIXME bug in preview (works in doc)
\Notes \Notes
\Text{}
\end{ShortExample} \end{ShortExample}
Auch hier kann optional das Label geändert werden. Auch hier kann optional das Label geändert werden.
\begin{ShortExample}{notesopt}{großes Feld} \begin{ShortExample}{notesopt}{großes Feld}
%%% FIXME bug in preview (works in doc)
\Notes[Stirnabdruck] \Notes[Stirnabdruck]
\Text{}
\end{ShortExample} \end{ShortExample}
\subsubsection{Checkboxen} \paragraph{\texcode{\InlineTextField}} Letztlich gibt es für Sonderfälle noch
Inline-Textfelder.
\paragraph{Normale Verwendung} Gibt es eigentlich nicht viel dazu zu sagen -- \begin{ShortExample}{inlinetextfield}{Sonderfall -- Inline}
\texttt{\textbackslash Checkbox\{Label\}} für eine Checkbox (und das Label kann \Text{Zur Fehlersuche wurden etwa
auch ein kompletter Absatz sein.) \InlineTextField[0.1]{} Stunden aufgewendet,
\InlineTextField[0.1]{} Gramm Koffein sowie
\InlineTextField{} konsumiert.
\formstrut % normierte Zeilenhöhe forcieren
}
\end{ShortExample}
Hierbei ist zu beachten, dass Textfelder höher sind als der umliegende Text.
Ohne das \texcode{\formstrut} würde die letzte Zeile \emph{deutlich} dichter an
der darüberliegenden kleben, was -- insbesondere wenn es stattdessen eine Zeile in der Mitte betrifft -- komisch aussehen würde. Das muss also ggf. in ≈jede Zeile eingestreut werden. Vergleiche auch nochmal:
\begin{ShortExample}{formstrutbad}{Wackeliger Text}
\Text{Zeile mit Feld \InlineTextField{} und
dann ganz viel Text, so dass dazwischen
mehrere Zeilen ohne Textfelder entstehen,
ein weiteres Feld \InlineTextField{}, mehr
Text der wieder etwas dichter beieinander
liegt, und dann irgendwann abschließend
nochmal eine Zeile mit noch einem Feld
\InlineTextField{} um den Unterschied zu
sehen.
}
\end{ShortExample}
\begin{ShortExample}{formstrutgood}{Gleichmäßiger Text}
\Text{Zeile mit Feld \InlineTextField{} und
dann ganz viel Text, so dass dazwischen
\formstrut
mehrere Zeilen ohne Textfelder entstehen,
ein weiteres Feld \InlineTextField{}, mehr
Text der wieder etwas dichter beieinander
\formstrut
liegt, und dann irgendwann abschließend
\formstrut
nochmal eine Zeile mit noch einem Feld
\InlineTextField{} um den Unterschied zu
sehen.\formstrut
}
\end{ShortExample}
Es wird hoffentlich deutlich, dass beide Varianten nicht ideal sind und
Inline-Felder nur in Ausnahmefällen die richtige Wahl sind. Dabei sollte aber
nochmal darauf hingewiesen werden, dass dieses Problem bei nur einer Zeile
Text nicht relevant ist, da dann die Abstände um die Block-Elemente herum
sowieso für ein einheitliches Aussehen sorgen.
% >>>
% >>>
\subsection{Checkboxen} % <<<
\subsubsection{\texcode{\Checkbox} -- normale Verwendung} % <<<
Gibt es eigentlich nicht viel dazu zu sagen -- \texcode{\Checkbox{Label}} für
eine Checkbox (und das Label kann auch ein kompletter Absatz sein.)
\begin{ShortExample}{checkbox}{Checkboxen} \begin{ShortExample}{checkbox}{Checkboxen}
\Checkbox{Ich habe die AGB, \Checkbox{Ich habe die AGB,
@ -453,9 +711,13 @@ auch ein kompletter Absatz sein.)
zum Lesen von Anleitungen gelesen.} zum Lesen von Anleitungen gelesen.}
\end{ShortExample} \end{ShortExample}
% >>>
\subsubsection{\texcode{\CheckboxOther}} % <<<
Für Freitextfelder als "Sonstige:" gibt es Für Freitextfelder als "Sonstige:" gibt es
\texttt{\textbackslash CheckboxOther[Breite]\{Label\}}, wieder mit optionaler \texcode{\CheckboxOther[Breite]{Label}}, wieder mit optionaler Breitenangabe
Breitenangabe (relativ zur Textbreite) für das Freitextfeld. (relativ zur Textbreite) für das Freitextfeld.
\begin{ShortExample}{othercheckbox}{"Sonstiges"} \begin{ShortExample}{othercheckbox}{"Sonstiges"}
\Text{Meine Lieblingstaste ist:} \Text{Meine Lieblingstaste ist:}
@ -473,15 +735,17 @@ einheitlicher sieht das Formular am Ende aus. Bei dem Beispiel würde ein
einzelner Buchstabe auch in ein 0.05-er Feld passen, das wären dann aber 3 einzelner Buchstabe auch in ein 0.05-er Feld passen, das wären dann aber 3
statt 2 verschiedener Breiten. statt 2 verschiedener Breiten.
\paragraph{Spezielle Zwecke} % >>>
\subsubsection{Spezielle Zwecke -- \texcode{\InlineCheckbox}} % <<<
In Sondersituationen könnten z.~B. in Aufzählungen innerhalb einer Zeile auch In Sondersituationen könnten z.~B. in Aufzählungen innerhalb einer Zeile auch
Checkboxen benötigt sein. Dafür gibt es die -- nur in Ausnahmefällen zu Checkboxen benötigt sein. Dafür gibt es die -- nur in Ausnahmefällen zu
verwendende -- Inline-Variante, welche sich (fast) gar nicht um die verwendende -- Inline-Variante, welche sich (fast) gar nicht um die
Formatierung kümmert und nur die Box zur Verfügung stellt. (Das Einzige: ein Formatierung kümmert und nur die Box zur Verfügung stellt. (Das Einzige: ein
Leerzeichen auf der rechten Seite wird sichergestellt, für gleichmäßige Leerzeichen auf der rechten Seite wird sichergestellt, für gleichmäßige
Abstände sollte also genau \emph{nicht} \texttt{\{\}} oder Abstände sollte also genau \emph{nicht} \texcode{{}} oder \texcode{\ }
\texttt{\textbackslash} angehängt werden.) angehängt werden.)
\begin{ShortExample}{inlinecheckbox}{Sonderfall -- Inline} \begin{ShortExample}{inlinecheckbox}{Sonderfall -- Inline}
\Text{Ich bin \InlineCheckbox groß, \Text{Ich bin \InlineCheckbox groß,
@ -499,18 +763,25 @@ Abstände sollte also genau \emph{nicht} \texttt{\{\}} oder
\end{Indented} \end{Indented}
\end{ShortExample} \end{ShortExample}
\subsection{Struktur} % >>>
% >>>
% >>>
\section{Struktur} % <<<
Drei Kategorien -- formularspezifisch, "klassische" Abschnitte, und mehrere Spalten. Drei Kategorien -- formularspezifisch, "klassische" Abschnitte, und mehrere Spalten.
\subsubsection{formularspezifisch angepasste Formen} \subsection{formularspezifisch angepasste Formen} % <<<
\paragraph{\texttt{Indented}} Visuelle Gruppierung durch Einrücken von \subsubsection{\texcode{\begin{Indented} ... \end{Indented}}} % <<<
zusammenhängenden bzw. untergeordneten Abschnitten ist eine sehr gute Option,
da ohne zusätzliche Tinte trotzdem klar die Struktur vermittelt wird. (Das Visuelle Gruppierung durch Einrücken von zusammenhängenden bzw. untergeordneten
wurde auch schon bei den Checkboxen unmittelbar hier drüber verwendet.) Abschnitten ist eine sehr gute Option, da ohne zusätzliche Tinte trotzdem klar
Optional kann ein Faktor (nicht zwingend ganzzahlig) für die Einrückungstiefe die Struktur vermittelt wird. (Das wurde auch schon bei den Checkboxen
angegeben werden. unmittelbar hier drüber verwendet.) Optional kann ein Faktor (nicht zwingend
ganzzahlig) für die Einrückungstiefe angegeben werden.
\begin{ShortExample}{indentation}{Einrückung, auch über mehrere Ebenen} \begin{ShortExample}{indentation}{Einrückung, auch über mehrere Ebenen}
\Text{abc} \Text{abc}
@ -525,12 +796,19 @@ angegeben werden.
\begin{Indented}[2] \begin{Indented}[2]
\Text{pqr} \Text{pqr}
\end{Indented} \end{Indented}
\begin{Indented}[1.4142]
\Text{stu}
\end{Indented}
\end{ShortExample} \end{ShortExample}
\paragraph{\texttt{\textbackslash RuleSection}} Dient zur Trennung von % >>>
Formularabschnitten, die durch verschiedene Personengruppen ausgefüllt werden.
Die Linie geht immer über die komplette Formularbreite und kann z.~B. nicht \subsubsection{\texcode{\RuleSection}} % <<<
innerhalb von mehrspaltigen Bereichen verwendet werden.
Dient zur Trennung von Formularabschnitten, die durch verschiedene
Personengruppen ausgefüllt werden. Die Linie geht immer über die komplette
Formularbreite und kann z.~B. nicht innerhalb von mehrspaltigen Bereichen
verwendet werden.
\begin{ShortExample}{rulesection}{Mehrere klar getrennte Abschnitte} \begin{ShortExample}{rulesection}{Mehrere klar getrennte Abschnitte}
\TextField{Name} \TextField{Name}
@ -540,8 +818,12 @@ innerhalb von mehrspaltigen Bereichen verwendet werden.
\CheckboxOther[0.5]{Abgelehnt, weil:} \CheckboxOther[0.5]{Abgelehnt, weil:}
\end{ShortExample} \end{ShortExample}
\paragraph{\texttt{\textbackslash Rule}} Eine einfache Trennlinie, die an % >>>
verschiedenen Stellen zur grafischen Trennung eingesetzt werden kann.
\subsubsection{\texcode{\Rule}} % <<<
Eine einfache Trennlinie, die an verschiedenen Stellen zur grafischen Trennung
eingesetzt werden kann.
\begin{ShortExample}{rule}{Mehr Trennlinien} \begin{ShortExample}{rule}{Mehr Trennlinien}
\RuleSection{Bearbeiter} \RuleSection{Bearbeiter}
@ -556,16 +838,18 @@ verschiedenen Stellen zur grafischen Trennung eingesetzt werden kann.
\CheckboxOther[0.5]{Abgelehnt, weil:} \CheckboxOther[0.5]{Abgelehnt, weil:}
\end{ShortExample} \end{ShortExample}
\clearpage % >>>
\subsubsection{"klassische" Struktur} % >>>
In \TeX\ üblich sind \texttt{\textbackslash section}, \subsection{"klassische" Struktur} % <<<
\texttt{\textbackslash subsection}, etc.; in Analogie dazu gibt es für ggf.
längere Formulare \texttt{\textbackslash Section} und In \TeX\ üblich sind \texcode{\section}, \texcode{\subsection}, etc.; in
\texttt{\textbackslash Subsection}. Für die meisten Formulare ist das jedoch Analogie dazu gibt es für ggf. längere Formulare \texcode{\Section} und
vermutlich nicht nötig, insbesondere da ggf. per Einrückung via \texcode{\Subsection}. Für die meisten Formulare ist das jedoch vermutlich
\texttt{Indented} visuell schneller lesbare Struktur geschaffen werden kann. nicht nötig, insbesondere da ggf. per Einrückung via
\texcode|\begin{Indented} ... \end{Indented}| visuell schneller lesbare
Struktur geschaffen werden kann.
\begin{ShortExample}{sectioning}{Abschnittsunterteilung} \begin{ShortExample}{sectioning}{Abschnittsunterteilung}
\Section{Allgemeines} \Section{Allgemeines}
@ -579,15 +863,15 @@ vermutlich nicht nötig, insbesondere da ggf. per Einrückung via
\Signature \Signature
\end{ShortExample} \end{ShortExample}
\clearpage % >>>
\subsubsection{mehrspaltige Bereiche} \subsection{mehrspaltige Bereiche} % <<<
Es gibt Unterstützung für 2, 3, und 5 Spalten (ggf. können diese auch Es gibt Unterstützung für 2, 3, und 5 Spalten (ggf. können diese auch
ineinander geschachtelt werden.) Die Befehle heißen -- vermutlich wenig ineinander geschachtelt werden.) Die Befehle heißen -- vermutlich wenig
überraschend -- \texttt{\textbackslash TwoColumns}, überraschend -- \texcode{\TwoColumns}, \texcode{\ThreeColumns}, und
\texttt{\textbackslash ThreeColumns}, und \texttt{\textbackslash FiveColumns} \texcode{\FiveColumns} und es sollten entsprechend viele \texcode{{}}-Gruppen
und es sollten entsprechend viele \texttt{\{\}}-Gruppen folgen. folgen.
\begin{ShortExample}{multicolumn}{Mehrspaltigkeit} \begin{ShortExample}{multicolumn}{Mehrspaltigkeit}
\TwoColumns{ \TwoColumns{
@ -621,26 +905,28 @@ Bei zu vielen Spalten werden die Abstände unlesbar -- siehe hier die
Foo/Bar/Baz-Gruppierung. Auf A4 geht diese Schachtelung aber üblicherweise noch Foo/Bar/Baz-Gruppierung. Auf A4 geht diese Schachtelung aber üblicherweise noch
problemlos. problemlos.
\subsection{Hervorhebung} % >>>
% >>>
\section{Hervorhebung} % <<<
Es gibt verschiedene in \TeX\ eingebaute Befehle, die ebenfalls verwendet Es gibt verschiedene in \TeX\ eingebaute Befehle, die ebenfalls verwendet
werden können\dots\ aber "weniger ist mehr" trifft insbesondere auch hier zu. werden können\dots\ aber "weniger ist mehr" trifft insbesondere auch hier zu.
Die meisten sollten also nur bei ernsthaftem Bedarf verwendet werden. Die meisten sollten also nur bei ernsthaftem Bedarf verwendet werden.
Eine akzeptable Formatierungsmethode ist das Hervorheben von Text mit Eine akzeptable Formatierungsmethode ist das Hervorheben von Text mit
\texttt{\textbackslash emph}. Üblicherweise typografisch eher verpönt, aber \texcode{\emph}. Üblicherweise typografisch eher verpönt, aber schon irgendwie
schon irgendwie zum aktuellen Design passend, können mit zum aktuellen Design passend, können mit \texcode{\ul} auch \emph{einzelne
\texttt{\textbackslash ul} auch \emph{einzelne Worte oder sehr kurze Passagen} Worte oder sehr kurze Passagen} unterstrichen werden, dabei ist jedoch zu
unterstrichen werden, dabei ist jedoch zu beachten, dass innerhalb beachten, dass innerhalb unterstrichener Bereiche keine Zeilenumbrüche mehr
unterstrichener Bereiche keine Zeilenumbrüche mehr möglich sind. (Der Bereich möglich sind. (Der Bereich wird als eine logische Box verpackt und kann nur
wird als eine logische Box verpackt und kann nur noch als Ganzes verschoben noch als Ganzes verschoben werden.)
werden.)
Es gibt zwar eigentlich viele verschiedene Schriftgrößen, es ist jedoch keine Es gibt zwar eigentlich viele verschiedene Schriftgrößen, es ist jedoch keine
gute Idee, alle quer durcheinander zu verwenden. Die Dokumentenklasse kümmert gute Idee, alle quer durcheinander zu verwenden. Die Dokumentenklasse kümmert
sich ums meiste, als einzige Akzeptable gibt es \texttt{\textbackslash details} sich ums meiste, als einzige Akzeptable gibt es \texcode{\details} (als
(als semantischen Namen), welche für untergeordnete Bemerkungen zur Verfügung semantischen Namen), welche für untergeordnete Bemerkungen zur Verfügung steht.
steht.
\begin{ShortExample}{formatting}{Formatierungsbeispiele} \begin{ShortExample}{formatting}{Formatierungsbeispiele}
\Text{Die Formulare sind \ul{sofort} \Text{Die Formulare sind \ul{sofort}
@ -662,5 +948,43 @@ oder -12!) zum Kopieren per Fax zu
verwenden.}} verwenden.}}
\end{ShortExample} \end{ShortExample}
% >>>
% >>>
\chapter{Hinweise zum Design} % <<<
Das aktuelle Design ist iterativ entstanden und vermutlich erstmal \emph{gut genug},
aber deutlich nicht komplett durchstrukturiert und -getestet.
\section{Schrift}
Die Schrift "Recursive" wird im Text mit \texttt{CASL=0.2} zwischen den
Extremen benutzt. Die anderen Achsen halten sich an die Standard-Werte
(\texttt{wght=400/700} für normal/fett, \texttt{slnt=0/-15} und
\texttt{CRSV=0/1} für normal/kursiv, und \texttt{MONO=0.0/1.0} für
normal/festbreite.) Für Titel wird sowohl das Gewicht leicht erhöht
(\texttt{wght=500/800}) als auch \texttt{CASL=0.4} verdoppelt. (Das ist schon
ziemlich kräftig, \texttt{CASL=1.0} ist zu extrem.)
\section{Formularfelder}
Textfeldhöhe plus Abstand zusammen sollten für Handschrift groß genug sein.
Die Grautöne wurden mit dem Drucker getestet und sollten sowohl bei direktem
Druck als auch bei einfacher Kopie lesbar bleiben. Mehr wurde da noch nicht
optimiert.
Die schrägen Label (um 1em rausgeschoben und um 4.20° rotiert) sind relativ gut
durchgetestet und sehen zusammen mit der Schrift chaotisch aus ohne tatsächlich
chaotisch zu sein. Solange das Label nicht zu lang wird, ist es auch beim
Ausfüllen des Formulars nicht zu sehr im Weg.
Abstände etc. sind eher so Bauchgefühl und nicht komplett durchdacht. Es gab
bisher noch keine offensichtlichen Probleme damit, aber müsste man mal nochmal
anschauen\dots
% >>>
\end{document} \end{document}
% vim: set fdm=marker fmr=<<<,>>> :

15
testdoc.tex Normal file
View file

@ -0,0 +1,15 @@
\documentclass[]{cccbform}
\begin{document}
\LogoTitle{Test-Dokument}
\TextField{Feld 1}
\TextField{Feld 2}
\ShortTextField{Feld 3}
\TextField{Feld 4}
\begin{Indented}
\TextField{Feld 5}
\TextField{Feld 6}
\end{Indented}
\TextField{Feld 7}
\Text{Abcd \InlineTextField{} efgh ijkl \InlineTextField{Feld 9} mnop qrst.}
\TextField{Feld 10}
\end{document}