toc-подобное хранилище для субтитров

toc-подобное хранилище для субтитров

Уважаемые эксперты: как написать подписи к таблицам для дальнейшего использования? Подумайте

\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файл, но мои любительские попытки застряли в аду расширения. На самом деле, для этого особого случая может быть даже более простое решение: я думаю, что файл .auxуже сохраняет подписи с использованием \newlabelwhen hyperref(когда его нет?), но мне нужно будет вытащить третье выражение в скобках из aux-written \newlabel. Вместо того, чтобы гадать дальше, я надеюсь, что это достаточно распространенная проблема, которая проста и станет хорошим ответом sx...

помощь признательна. /iaw

решение1

Это «грязный» трюк: \newlabelявно запишите в .auxфайл префикс для новой метки, скажем, stored::и используйте \nameref*from hyperref, чтобы получить содержимое метки.

Аргументы {}{}и {}здесь могут быть пустыми, поскольку они не важны для данного подхода.

Однако расширение будет проблемой. Если само содержимое заголовка содержит команды, которые довольно просты, \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}

введите описание изображения здесь

Связанный контент