
我正忙於處理經常更改的文件。特別是所使用的尺寸改變。這導致我在更改尺寸時很可能會錯過某個值。為了解決這個問題,我創建了一個包含 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 個地方可以更改所有 te 值
謝謝
答案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}
也可以檢查逗號是否存在,但順序很重要。