我想将参数传递给我在文档中多处使用的命令。我想在序言中设置该参数,这样我就不必在文档的后面编辑该命令了。
我的 MWE:我必须在表格注释中报告备选样本量。我想通过在序言中设置参数来选择正确的样本量。
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\fixsmpl}[1]{%
\ifstrequal{#1}{l}%
{Sample runs from april to may}%
{\ifstrequal{#1}{s}{Sample 2}{\PackageError{fixsmpl}{Undefined option to fixsmpl command}{}}}%
}
\def\X{s}
\begin{document}
% Works fine
\fixsmpl{s}
% Doesn't work
\fixsmpl{\X}
\end{document}
我很困惑,因为我能够在下面的例子中传递参数:
%preamble
\newcommand{\inputtable}[2]{\input{../tables/table#1#2}}
\def\Z{2dp}
\begin{document}
\inputtable{1}{_\Z}
答案1
此宏\ifstrequal
不对其参数进行扩展。可以定义一个进行扩展的新宏,但最好借助 来避免大量嵌套expl3
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\fixsmpl}{m}
{
\str_case_e:nVF { #1 } \c_dagfinn_fixsmpl_tl
{
\PackageError{fixsmpl}{Undefined ~ option ~ to ~ fixsmpl ~ command}{}
}
}
\prg_generate_conditional_variant:Nnn \str_case_e:nn {nV} {T,F,TF,p}
\NewDocumentCommand{\fixsmplcases}{m}
{
\tl_const:Nn \c_dagfinn_fixsmpl_tl { #1 }
}
\ExplSyntaxOff
\fixsmplcases{
{s}{Sample 2}
{l}{Sample runs from April to May}
{t}{Sample runs from June to September}
}
\newcommand{\X}{s}
\newcommand{\Y}{t}
\begin{document}
% Fine
\fixsmpl{s}
% Fine
\fixsmpl{\X}
% Fine
\fixsmpl{\Y}
% Error
\fixsmpl{z}
\end{document}
间接的原因(我的意思是使用\fixsmplcases
外面\ExplSyntaxOn...\ExplSyntaxOff
是为了避免用 表示空格~
,这可能会很麻烦。
您可以根据需要定义任意数量的案例。