部分名称中的命令具有多个“后备”到其他命令的功能

部分名称中的命令具有多个“后备”到其他命令的功能

我想编写一个可能需要 0 个或 1 个参数的命令,并在中使用它\section,例如:

\documentclass{article}

\usepackage{hyperref}
\usepackage{color}
\usepackage{ulem}

\makeatletter

\def\mycmd{\@ifnextchar[{\@with}{\@with[0]}}
\def\@with[#1]#2{{\color{red}\texorpdfstring{\sout{#2}}{#2}}}

\makeatother

\begin{document}

% This works:
\mycmd{Test 0}
\mycmd[1]{Test 1}

% This does not compile:
\section{\mycmd{Test 0}}
\section{\mycmd[1]{Test 1}}

\end{document}

如您所见,初始命令\mycmd使用\ifnextchar并回退到\@with,我认为这就是导致问题的原因。它尝试使用,\texorpdfstring但我没能让它工作。

我得到的确切错误是:

! \@sect 的参数有一个额外的 }。

<插入文本>

\par

l.21 \section{\mycmd{测试 0}}

编辑:最终目标是实现一个版本控制系统,以便\rem{}根据另一个变量对其进行着色或删除,并具有多个版本级别(\rem[0]{}\rem[1]{})。我已经有很多可以\rem{}运行的文件,但我想添加额外的参数,而不必用 替换所有内容\rem[0]

答案1

您需要可选参数测试才能受到保护,但\texorpdfstring在保护之前必须看到

在此处输入图片描述

\documentclass{article}

\usepackage{hyperref}
\usepackage{color}
\usepackage{ulem}


\def\mycmd#1#{\mycmdy{#1}}
\def\mycmdy#1#2{\texorpdfstring{\mycmdx#1{#2}}{#2}}
\newcommand\mycmdx[2][0]{\textcolor{red}{\sout{#2}}}

\makeatother

\begin{document}

% This works:
\mycmd{Test 0}
\mycmd[1]{Test 1}

% This does not compile:
\section{\mycmd{Test 0}}
\section{\mycmd[1]{Test 1}}

\end{document}

答案2

这是您可能喜欢的替代语法

\documentclass{scrartcl}

\usepackage{xcolor}
\usepackage{ulem}

\usepackage{hyperref}

\def\setremnone#1{\long\expandafter\def\csname rem#1\endcsname##1{}}
\def\setremcolor#1#2{\long\expandafter\def\csname rem#1\endcsname##1{\texorpdfstring{\textcolor{#2}{\sout{##1}}}{##1}}}
\def\rem#1#{\csname rem\if\relax\detokenize{#1}\relax0\else#1\fi\endcsname}

\setremcolor1{red}
\setremcolor0{blue}

\begin{document}

\rem{Test 0}
\rem1{Test 1}

\section{\rem{Test 0}}
\section{\rem1{Test 1}}

\setremnone0
\setremcolor1{orange}

\rem{Test 0}
\rem1{Test 1}

\end{document}

因此只会吞噬\rem0{content}内容和\rem1{whatever}颜色;或者无论您用和决定什么。whateverred\setremcolor\setremnone

相关内容