各位专家:如何写出表格标题以供以后使用?想想
\documentclass{article}
\newcommand{\mycaption}[2]{\caption{#2}\label{#1}\savecaptioncontent{#1}{#2}}
\newcommand{\insertmytable}[1]{
\begin{center}
Insert Table~\ref{#1} here: '\contentcaption{#1}'
\end{center}
}
\begin{document}
blah blah. Table~\ref{tbl:first} tells me little.
\insertmytable{tbl:first}
above, it should have printed:
\begin{center}
Insert Table~\ref{tbl:first} here: 'This is my first table'
\end{center}
\begin{table}
\mycaption{tbl:first}{This is my first table}
\end{table}
\end{document}
我几乎肯定想写入文件.aux
,但我的业余尝试陷入了扩展地狱。事实上,对于这种特殊情况可能有一个更简单的解决方案:我认为文件已经使用when.aux
保存了字幕(什么时候不是?),但我需要从 aux-written 中挑选出第三个带括号的表达式。与其进一步猜测,我希望这是一个足够常见的问题,它很容易并且成为一个好的 sx 答案......\newlabel
hyperref
\newlabel
感谢帮助。/iaw
答案1
这是一个“肮脏”的伎俩:\newlabel
明确地向.aux
文件写入一个新标签的前缀,然后stored::
使用\nameref*
fromhyperref
来获取标签内容。
{}{}
和参数{}
在这里可以为空,因为它们对于这种方法并不重要。
但是,扩展会是个问题。如果标题内容本身包含的命令非常简单,则\unexpanded{}
应该使用。更好的解决方案取决于确切的要求。
\documentclass{article}
\usepackage{caption}
\usepackage{hyperref}
\makeatletter
\newcommand{\savecaptioncontent}[2]{%
\immediate\write\@auxout{%
\string\newlabel{stored::#1}{{}{}{\unexpanded{#2}}{}}%
}
}
\newcommand{\contentcaption}[1]{%
\nameref*{stored::#1}%
}
\makeatother
\newcommand{\mycaption}[2]{\caption{#2}\label{#1}\savecaptioncontent{#1}{#2}}
\newcommand{\insertmytable}[1]{
\begin{center}
Insert Table~\ref{#1} here: '\contentcaption{#1}'
\end{center}
}
\begin{document}
blah blah. Table~\ref{tbl:first} tells me little.
But now:
\insertmytable{tbl:first}
above, it should have printed:
\begin{center}
Insert Table~\ref{tbl:first} here: 'This is my first table'
\end{center}
\begin{table}
\mycaption{tbl:first}{This is my first table}
\end{table}
\end{document}