我想编写一个可能需要 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}
颜色;或者无论您用和决定什么。whatever
red
\setremcolor
\setremnone