nuevo comando múltiples valores predeterminados

nuevo comando múltiples valores predeterminados

Estoy ocupado con un documento que cambia con frecuencia. y especial las dimensiones utilizadas cambian. Esto da como resultado una gran posibilidad de que pierda un valor cuando cambio las dimensiones. Para abordar este problema hice un comando con 3 variables (L, W, H). Con la ayuda dehttp://en.wikibooks.org/wiki/LaTeX/MacrosHago el siguiente comando.

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

Ahora no puedo entender cómo hacer 3 valores predeterminados. para tener 1 lugar para cambiar todos los valores

Gracias

Respuesta1

Quiere una interfaz clave-valor, por lo que el orden en el que establece los valores es irrelevante.

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

ingrese la descripción de la imagen aquí

Lo mismo, pero con expl3sintaxis.

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

Respuesta2

Los tres se pueden configurar con \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}

ingrese la descripción de la imagen aquí

Otra posibilidad es utilizar una lista separada por comas:

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

ingrese la descripción de la imagen aquí

También es posible comprobar la existencia de las comas, pero el orden es importante.

información relacionada