neuer Befehl mehrere Standardwerte

neuer Befehl mehrere Standardwerte

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}

Bildbeschreibung hier eingeben

Das Gleiche, aber mit expl3Syntax.

\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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

Es ist auch möglich, das Vorhandensein der Kommas zu überprüfen, aber dann ist die Reihenfolge wichtig.

verwandte Informationen