![newcommand 多个默认值](https://linux22.com/image/290090/newcommand%20%E5%A4%9A%E4%B8%AA%E9%BB%98%E8%AE%A4%E5%80%BC.png)
我忙于处理一个经常更改的文档。特别是使用的尺寸会发生变化。这导致我在更改尺寸时很有可能错过一个值。为了解决这个问题,我创建了一个包含 3 个变量(L、W、H)的命令。借助http://en.wikibooks.org/wiki/LaTeX/Macros我发出以下命令。
\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}$}
现在我不知道如何设置 3 个默认值。这样我就有一个地方可以更改所有值
谢谢
答案1
您需要一个键值接口,因此设置值的顺序无关紧要。
\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}
相同,但有expl3
语法。
\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}
答案2
所有三个都可以设置\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}
另一种可能性是使用逗号分隔的列表:
\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}
也可以检查逗号是否存在,但顺序很重要。