我正在尝试在定义表格行的命令中生成页面引用,其中引用的标签名称是使用字符串进行某些字符串操作的结果。这是我尝试执行的操作的简化版本,根据命令参数 FO_O 生成对 OPSFOO 标签的引用,字符串处理会删除下划线并在前面添加 OPS:
\documentclass{article}
\usepackage{stringstrings}
\newcommand{\opind}[2]{
\convertchar[q]{OPS#2}{\_}{}
#1 & #2 & \pageref{\thestring} \\
}
\begin{document}
\begin{table}[h]
\begin{tabular}{l l l}
\opind{1}{FO\_O} \\
\end{tabular}
\end{table}
\clearpage
\label{OPSFOO} FOO \\
\end{document}
失败并出现错误“!未定义的控制序列。\thestring”
我认为在命令中使用 \thestring 可能有问题,因此我尝试将其直接放入表格条目中,如下所示:
\begin{table}[h]
\begin{tabular}{l l l}
\convertchar[q]{OPSFO\_O}{\_}{}
1 & FO\_O & \pageref{\thestring} \\
\end{tabular}
\end{table}
但这本质上会得到相同的错误。所以我开始怀疑使用 \thestring 作为 \pageref 的参数是否存在问题。显然不是;如果我在表格外进行字符串操作,一切都会正常:
\convertchar[q]{OPSFO\_O}{\_}{}
\begin{table}[h]
\begin{tabular}{l l l}
1 & FO\_O & \pageref{\thestring} \\
\end{tabular}
\end{table}
我可以做些什么来使字符串操作和 \pageref{\thestring} 的使用在表内调用的命令中起作用,如上面的第一个代码清单所示?
答案1
根据stringstrings
文档,\thestring
只是一个\edef
ined 宏,仅在本地组(此处为表格单元格)中有效。要将内容传输到后面的表格单元格,必须创建一个全局的\edef
,即使用\xdef
带有一些辅助宏的 ,例如\theglobalstring
\documentclass{article}
\usepackage{stringstrings}
\newcommand{\opind}[2]{
\convertchar[q]{OPS#2}{\_}{}
\xdef\theglobalstring{\thestring}
#1 & #2 & \pageref{\theglobalstring} \\
}
\begin{document}
\begin{table}[h]
\begin{tabular}{l l l}
\opind{1}{FO\_O} \\
\end{tabular}
\end{table}
\label{OPSFOO} FOO \\
\clearpage
\end{document}
答案2
受到 Christian Hupfer 对该问题的评论的启发,但避免像在他的回答中使用全局变量:
\newcommand{\opind}[2]{
#1 & #2 & \convertchar[q]{OPS#2}{\_}{} \pageref{\thestring} \\
}