将参数从前言传递到命令

将参数从前言传递到命令

我想将参数传递给我在文档中多处使用的命令。我想在序言中设置该参数,这样我就不必在文档的后面编辑该命令了。

我的 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是为了避免用 表示空格~,这可能会很麻烦。

您可以根据需要定义任意数量的案例。

在此处输入图片描述

相关内容