newcommand vários valores padrão

newcommand vários valores padrão

Estou ocupado com um documento que muda com frequência. e especial as dimensões utilizadas mudam. Isso resulta em uma grande chance de eu perder um valor ao alterar as dimensões. Para resolver este problema fiz um comando com 3 variáveis ​​(L,W,H). Com a ajuda dehttp://en.wikibooks.org/wiki/LaTeX/Macroseu faço o seguinte 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}$}

Agora não consigo descobrir como criar 3 valores padrão. para que eu tenha 1 lugar para alterar todos os valores te

Obrigado

Responder1

Você deseja uma interface de valor-chave, portanto a ordem em que você define os valores é 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}

insira a descrição da imagem aqui

O mesmo, mas com expl3sintaxe.

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

Responder2

Todos os três podem ser definidos com \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}

insira a descrição da imagem aqui

Outra possibilidade é usar uma lista separada por vírgulas:

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

insira a descrição da imagem aqui

Também é possível verificar a existência das vírgulas, mas a ordem é importante.

informação relacionada