
Ich arbeite mit einem Dokument, das sich häufig ändert. Und insbesondere die verwendeten Abmessungen ändern sich. Dies führt dazu, dass ich einen Wert übersehe, wenn ich die Abmessungen ändere. Um dieses Problem zu lösen, habe ich einen Befehl mit 3 Variablen (L, B, H) erstellt. Mit Hilfe vonhttp://en.wikibooks.org/wiki/LaTeX/Macrosich gebe den folgenden Befehl ein.
\newcommand{\dimsEN}[3][default value]{The dimensions ($\mathrm{L} \times \mathrm{W} \times
\mathrm{H}$) of the room are $\mathrm{#1} \times \mathrm{#2} \times \mathrm{#3}$}
Jetzt kann ich nicht herausfinden, wie ich 3 Standardwerte erstellen kann. damit ich 1 Ort habe, um alle Werte zu ändern
Danke
Antwort1
Sie möchten eine Schlüssel-Wert-Schnittstelle, daher ist die Reihenfolge, in der Sie die Werte festlegen, irrelevant.
\documentclass{article}
\usepackage{keyval}
\makeatletter
\define@key{janbertdims}{l}{\def\janbert@l{#1}}
\define@key{janbertdims}{w}{\def\janbert@w{#1}}
\define@key{janbertdims}{h}{\def\janbert@h{#1}}
% initialize; change here to your preferred values
\setkeys{janbertdims}{
l=1,
w=1,
h=1,
}
\newcommand\dimsEN[1][]{%
\begingroup
\setkeys{janbertdims}{#1}% the current values
The dimensions ($\mathrm{L} \times \mathrm{W} \times \mathrm{H}$)
of the room are
$\janbert@l \times \janbert@w \times \janbert@h$%
\endgroup
}
\makeatother
\begin{document}
\dimsEN
\dimsEN[h=3]
\dimsEN[h=4,w=2]
\dimsEN[w=3,l=5,h=2]
\end{document}
Das Gleiche, aber mit expl3
Syntax.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dimsEN}{ O{} }
{
\group_begin: % keep the changes to the keys local
\janbert_dims_en:n { #1 }
\group_end:
}
\keys_define:nn { janbert/dims }
{
l .tl_set:N = \l__janbert_dims_l_tl,
w .tl_set:N = \l__janbert_dims_w_tl,
h .tl_set:N = \l__janbert_dims_h_tl,
%%% default values
l .initial:n = { 1 },
w .initial:n = { 1 },
h .initial:n = { 1 },
}
\cs_new_protected:Npn \janbert_dims_en:n #1
{
\keys_set:nn { janbert/dims } { #1 }
The ~ dimensions ~ ($\mathrm{L} \times \mathrm{W} \times \mathrm{H}$)
of ~ the ~ room ~ are ~
$\l__janbert_dims_l_tl \times \l__janbert_dims_w_tl \times \l__janbert_dims_h_tl$
}
\ExplSyntaxOff
\begin{document}
\dimsEN
\dimsEN[h=3]
\dimsEN[h=4,w=2]
\dimsEN[l=5,h=2,w=3]
\end{document}
Antwort2
Alle drei können eingestellt werden mit \dimsEN<value>
:
\documentclass[12pt]{article}
\makeatletter
\def\dimsEN{\@ifnextchar[\dimsEN@i\dimsEN@ii}
\def\dimsEN@i[#1]#2#3{%
The dimensions ($\mathrm{L} \times \mathrm{W} \times
\mathrm{H}$) of the room are $\mathrm{#1} \times \mathrm{#2} \times \mathrm{#3}$}
\def\dimsEN@ii{\@ifnextchar<\dimsEN@iii{\dimsEN@i[3]}}%% 3 is the default
\def\dimsEN@iii<#1>{\dimsEN@i[#1]{#1}{#1}}
\makeatother
\begin{document}
\dimsEN{1}{2}% default #1=3
\dimsEN<5>% all are 5
\dimsEN[1]{2}{3}
\end{document}
Eine andere Möglichkeit besteht darin, eine durch Kommas getrennte Liste zu verwenden:
\documentclass[12pt]{article}
\makeatletter
\def\dimsEN#1{\dimsEN@i#1\@nil}
\def\dimsEN@i#1,#2,#3\@nil{%
\ifx\relax#1\relax \def\@argA{1}\else\def\@argA{#1}\fi% the default is always 1
\ifx\relax#2\relax \def\@argB{1}\else\def\@argB{#2}\fi%
\ifx\relax#3\relax \def\@argC{1}\else\def\@argC{#3}\fi%
The dimensions ($\mathrm{L} \times \mathrm{W} \times
\mathrm{H}$) of the room are $\mathrm{\@argA} \times \mathrm{\@argB} \times \mathrm{\@argC}$}
\makeatother
\begin{document}
\dimsEN{1,2,3} \par
\dimsEN{1,2,} \par
\dimsEN{1,,} \par
\dimsEN{,2,3} \par
\dimsEN{,,3} \par
\dimsEN{,,}
\end{document}
Es ist auch möglich, das Vorhandensein der Kommas zu überprüfen, aber dann ist die Reihenfolge wichtig.