2017 年 6 月更新

2017 年 6 月更新

根据 Joseph Wright 的回答xparse 中的可选参数:\IfBooleanTF 与 \IfNoValueTF

-type参数k最近已调整:您现在需要e-type

问题:

  1. 新的 -type 参数的功能是什么e?它与以前的 -type 参数有何不同k

  2. 2016-11-21 版 xparse 文档k根本没有提到 -type 参数。计划是保留早期的功能(但已弃用,因此没有文档)还是最终会将其删除,并应消除对其的任何使用?如果计划将其删除,那么较旧的-type 参数功能将保留k多长时间。kxparse

代码:

k来自的 -type 参数 的示例Xparse t 参数类型(带可选参数的下划线)。了解如何修改它以使用新e类型参数将会很有用。

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

\NewDocumentCommand\MyMacro{k_}{%
    \IfNoValueTF{#1}{%
        \mathbf{A}
    }{%
        A_{\textcolor{red}{#1}}
    }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$ 

Without any subscript: $\MyMacro$ 

\end{document}

答案1

k参数类型不再可用。

k新款和旧款有很大区别e

e{ABC}

(这里ABC代表任意三个不同的标记)宏将查找形式为的任意标记序列A{x}B{y}C{z},但顺序是任意的,因此

A{x}B{y}C{z}
B{y}A{x}C{z}
C{z}B{y}A{x}

将导致在宏替换文本中传递与 相同的标记列表#<n>。重复其中一个所述标记将导致停止搜索下一个标记,因此

A{x}A{Ouch}B{y}C{z}

A这与仅传递参数{x}而其他两个标记不传递任何内容相同。

该参数根据顺序进行规范化,并将#<n>表示为带有括号的标记列表的序列,其中-NoValue-为缺失的标记列表。例如

\NewDocumentCommand{\test}{ e{ABC} }{%
  \showtokens{#1}%
}

使用输入

\test
\test A{x}
\test A{x}B{y}C{z}
\test B{y}C{z}A{x}
\test B{y}A{x}C{z}
\test A{x}B{y}
\test C{z}

将显示

> {-NoValue-}{-NoValue-}{-NoValue-}.
> {x}{-NoValue-}{-NoValue-}.
> {x}{y}{z}.
> {x}{y}{z}.
> {x}{y}{z}.
> {x}{y}{-NoValue-}.
> {-NoValue-}{-NoValue-}{z}.

结果是你应该传递#1其他宏用于后续处理,即使只有一个修饰前缀标记;这样的宏必须具有所需数量的强制参数。

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

\NewDocumentCommand\MyMacro{e_}{%
  \MyMacroProcess#1%
}
\NewDocumentCommand\MyMacroProcess{m}{%
    \IfNoValueTF{#1}{%
        \mathbf{A}
    }{%
        A_{\textcolor{red}{#1}}
    }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$

Without any subscript: $\MyMacro$

\end{document}

#1请注意,的代码中不应有括号\MyMacro。这是“处理参数”的正常过程。

2017 年 6 月更新

的较新版本xparseeE参数类型进行了重大更改。现在e<tokens>在 中的每个标记的替换文本中返回一个参数<tokens>,因此这种情况的代码必须变为

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

\NewDocumentCommand\MyMacro{e_}{%
  \IfNoValueTF{#1}{%
    \mathbf{A}
  }{%
    A_{\textcolor{red}{#1}}
  }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$

Without any subscript: $\MyMacro$

\end{document}

如果未找到相应的标记,则参数将包含-NoValue-(可用来测试)。\IfNoValueTF

答案2

由于我花了一些时间来应用带有几个参数的 egreg 答案,因此我提供了我使用的另一个 MWE:

\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}

\NewDocumentCommand\Median{O{s} m e{_}}{%
  \MyMedian{#1}{#2}#3%
}
\NewDocumentCommand\MyMedian{m m m}{%
  \IfNoValueTF{#3}{\gdef\temp{0,5}}{\gdef\temp{0,5;#3}}%
  \IfSubStr{s}{#1}{#2_{\temp}}{}%
  \IfSubStr{e}{#1}{\uppercase{#2}_{\temp}}{}%
}

\begin{document}
$$\Median{x}$$      % x_{0.5}   median of a sample
$$\Median{x}_i$$    % x_{0.5,i} median of subgroup i in a sample
$$\Median[e]{x}$$   % X_{0.5}   sample median (random variable)
$$\Median[e]{x}_i$$ % X_{0.5,i} sample median of subgroup i (random variable)
\end{document}

相关内容