PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parameter bei NewDocumentCommand gezielt ansteuern



MC3330
28-12-2019, 08:10
Hallo,

ich habe mir für Ticks verschiedene Befehle mit NewDocumentCommand erstellt. Dabei reize ich teilweise die 9 möglichen Optionen aus, wobei die meisten Parameter einen Defaultwert haben. Das ist dann häufig etwas sperrig, wenn ich alle Parameter in der Standardeinstellung lassen möchte und nur beim 8. oder 9. etwas ändern will.

Innerhalb von TIKZ gibt es bei der Umgebung "scope" die Möglichkeit Parameter gezielt anzusprechen. Indem man zum Beispiel schreibt "\begin{scope}[yshift=1cm]"

Ist es irgendwie möglich, sowas bei NewDocumentCommand zu realisieren?

Ich habe mal ein MB zum Verständnis gemacht.

Ich würde es gerne hinbekommen, dass ich statt
"\msbzehner[0][1]"
sowas wie
"\msbzehner[laenge=1]", "\msbzehner[xshift=1]" oder "\msbzehner[laenge=1, xshift = 2]"
schreiben kann.





\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{math}


%%Zehner Dienes Material
%1: xshift 2: laenge
\NewDocumentCommand{\msbzehner}{ O{0} O{0.15}}{
\def \scale {#2}
\tikzmath{
\cos = cos(45)*\scale/2;
\lwmsb = 0.15 + (#2-0.25)*0.1;
\zehn = #2*10;
}
\begin{scope}[xshift=#1cm]
\fill[fill=gray!50](0,0)--(\scale,0)--(\scale,\zehn)--(0,\zehn)--cycle;
\fill[fill=gray!50](\scale,0)--(\scale+\cos,\cos)--(\scale+\cos,\zehn+\cos)--(\scale,\zehn)--cycle;
\fill[fill=gray!50](0,\zehn)--(\scale,\zehn)--(\scale+\cos,\zehn+\cos)--(\cos,\zehn+\cos)--cycle;
\draw[line width = \lwmsb mm](0,0)--(\scale,0)--(\scale+\cos,\cos)--(\scale+\cos,\zehn+\cos)--(\cos,\zehn+\cos)--(0,\zehn)--cycle;
\draw[line width = \lwmsb mm](0,\zehn)--(\scale,\zehn)--(\scale+\cos,\zehn+\cos)--(\scale,\zehn)--(\scale,0);
\foreach \n in {1,...,9} {
\tikzmath{\step = #2*\n;}
\draw[line width = \lwmsb mm](0,\step)--(\scale,\step)--(\scale+\cos,\step+\cos);
}
\end{scope}
}


\begin{document}
\begin{tikzpicture}
\msbzehner[0][0.15]

\msbzehner[3][0.3]

\msbzehner[6][0.6]

\msbzehner[9][1]

\end{tikzpicture}

\end{document}

rais
29-12-2019, 11:39
Das geht sogar mit \newcommand -- z.B. mit dem pgfkeys-Paket, das von tikz bereits geladen wird.


\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{math}

%%Zehner Dienes Material
\pgfkeys{/SWIZZ/side color/.initial=gray!50,
/SWIZZ/top color/.initial=gray!50,
/SWIZZ/front color/.initial=gray!50,
/SWIZZ/xshift/.initial=0,
/SWIZZ/magnification/.initial=0.15}

\newcommand*\msbzehner[1][xshift=0,magnification=0.15]{%
\pgfkeys{/SWIZZ/.cd,#1}
\pgfkeysgetvalue{/SWIZZ/magnification}{\scale}
\tikzmath{
\cos = cos(45)*\scale/2;
\lwmsb = 0.15 + (\scale-0.25)*0.1;
\zehn = \scale*10;
}
\begin{scope}[xshift=\pgfkeysvalueof{/SWIZZ/xshift}cm]
\fill[fill=\pgfkeysvalueof{/SWIZZ/front color}](0,0)--(\scale,0)--(\scale,\zehn)--(0,\zehn)--cycle;
\fill[fill=\pgfkeysvalueof{/SWIZZ/side color}](\scale,0)--(\scale+\cos,\cos)--(\scale+\cos,\zehn+\cos)--(\scale,\zehn)--cycle;
\fill[fill=\pgfkeysvalueof{/SWIZZ/top color}](0,\zehn)--(\scale,\zehn)--(\scale+\cos,\zehn+\cos)--(\cos,\zehn+\cos)--cycle;
\draw[line width = \lwmsb mm](0,0)--(\scale,0)--(\scale+\cos,\cos)--(\scale+\cos,\zehn+\cos)--(\cos,\zehn+\cos)--(0,\zehn)--cycle;
\draw[line width = \lwmsb mm](0,\zehn)--(\scale,\zehn)--(\scale+\cos,\zehn+\cos)--(\scale,\zehn)--(\scale,0);
\foreach \n in {1,...,9} {
\tikzmath{\step = \scale*\n;}
\draw[line width = \lwmsb mm](0,\step)--(\scale,\step)--(\scale+\cos,\step+\cos);
}
\end{scope}
}

\begin{document}
\begin{tikzpicture}
\msbzehner

\msbzehner[xshift=3,magnification=0.3]

\msbzehner[xshift=6,magnification=0.6]

\msbzehner[xshift=9,magnification=1, front color=blue!30, top color=red!20, side color=blue!50]

\end{tikzpicture}
\end{document}

Die Beschreibung zum pgfkeys-Paket findest Du in der pgf/tikz-Doku unter "Key Management".

Guten Rutsch :)

MC3330
29-12-2019, 14:09
Großartig, herzlichen Dank. Ich wünsche ebenfalls einen guten Rutsch.