如何将 \numlist 与 \uppercase 结合使用

如何将 \numlist 与 \uppercase 结合使用

在我的项目中,有时我需要在环境中使用\numlistfrom 。但是,numlist 命令的附加选项无法正确检测,如以下 MWE 所示。siunitx\uppercase

\documentclass[draft]{article}
\usepackage{siunitx}

\begin{document}

This does work: \numlist[parse-numbers=false]{2;3;4;5X}.

\uppercase{This does not work: \numlist[parse-numbers=false]{2;3;4;5X}.}

\end{document}

这会产生以下错误

siunitx 无法识别选项文件‘PARSE-NUMBERS’:可能拼写不正确。

并且结果输出不正确。

答案1

问题显然是\uppercase作用于该key=val对上。

解决这个问题的一种方法是使用textcase包及其\MakeTextUppercase并包裹你不想受到影响的东西\NoCaseChange{...}

这种方式有效

\documentclass[draft]{article}
\usepackage{siunitx}
\usepackage[overload]{textcase}
\begin{document}

This does work: \numlist[parse-numbers=false]{2;3;4;5X}.

\MakeTextUppercase{This does not : \NoCaseChange{\numlist[parse-numbers=false]{2;3;4;5X}}.}

\end{document}

答案2

这将实现您的目标,但这意味着\sectionmark每次使用时都要重新定义\numlist

\documentclass{book}
\usepackage{siunitx}
\usepackage{lipsum}

\begin{document}
\csname protected@edef\endcsname\numlistA{\numlist[parse-numbers=false]{2;3;4;5X}}% \numlistA passed to TOC unexpanded
\tableofcontents

\csname protected@edef\endcsname\numlistB{\numlist[parse-numbers=false, list-final-separator={~AND~}]{2;3;4;5X}}%
\def\sectionmark#1{\let\numlistA\relax
      \markright {\MakeUppercase{#1}\numlistB}}

\section{This does not work \numlistA}

\lipsum[1-12]

\end{document}

真正奇怪的是,如果您更改的定义\numlistA,和\tableofcontents都会\markright使用错误的定义,目录中使用“AND”,标题中使用“and”。

相关内容