
Liebe Experten: Wie schreibt man die Tabellenüberschriften für die spätere Verwendung? Denken Sie
\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}
Ich möchte mit ziemlicher Sicherheit in die .aux
Datei schreiben, aber meine amateurhaften Versuche stecken in der Erweiterungshölle fest. Tatsächlich könnte es für diesen Sonderfall eine noch einfachere Lösung geben: Ich glaube, die .aux
Datei speichert bereits Untertitel mit einem „ \newlabel
when hyperref
is used“ (wann nicht?), aber ich müsste den dritten eingeklammerten Ausdruck aus dem „aux-written“ herausnehmen \newlabel
. Anstatt weiter zu raten, hoffe ich, dass dies ein so häufiges Problem ist, dass es einfach ist und eine gute sx-Antwort ergibt …
Hilfe ist willkommen. /iaw
Antwort1
Dies ist ein „schmutziger“ Trick: Schreiben Sie \newlabel
explizit in die .aux
Datei mit einem Präfix für ein neues Etikett stored::
und verwenden Sie beispielsweise \nameref*
„from“ hyperref
, um den Etiketteninhalt abzurufen.
Die Argumente {}{}
und {}
können hier leer bleiben, da sie für diesen Ansatz nicht wichtig sind.
Die Erweiterung wird jedoch ein Problem sein. Wenn der Untertitelinhalt selbst recht einfache Befehle enthält, \unexpanded{}
sollten diese verwendet werden. Eine bessere Lösung hängt von den genauen Anforderungen ab.
\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}