将字幕存储在文件中

将字幕存储在文件中

我想让 LaTeX 从存储在某个文件中的列表中读取图形标题,而不是直接在命令中写入文本\caption{}。但是,我还不知道这是否可以做到,也不知道该怎么做。

最好的情况是这样的:标题与某种识别方式一起存储在纯文本文件中(标签或标记可能以某种方式与标题本身分开,例如制表符或分号等)。从 tex 文件中,应该能够调用类似的东西\caption{\ReadFromFile[file]{tag}}。这样,人们仍然应该能够依靠 Latex 进行自动浮点编号等,但外部文件结构可能会变得有点复杂。

另一种可能性是将字幕作为连续的行存储在文件中,读取它们并调用类似的东西\caption{\Nextcaption}。当然,在这种情况下,人们必须知道先验浮点编号,但外部文件结构将很简单,因此可重复使用(我想到这种情况的场景是科学出版,其中一些期刊要求以纯文本形式提供单独的图形标题文件)。

欢迎提出建议!

答案1

您可以使用指定的名称来调用字幕,该名称也可用于\label。您将编写字幕文件,例如captions.tex,如下所示

% #1 is the caption name, #2 is the caption text
\newcommand{\definecaption}[2]{%
   \expandafter\newcommand\csname 4gamma@caption@#1\endcsname{#2}}
\newcommand{\usecaption}[1]{%
   \caption{\csname 4gamma@caption@#1\endcsname\label{#1}}

% Now the captions

\definecaption{cat}{This is my cat}
\definecaption{dog}{This is my dog}

你会说\input{captions}之前\begin{document}。然后你可以写

\begin{figure}
\centering
\includegraphics{cat}
\usecaption{cat}
\end{figure}

不过,我不太确定这是否比将标题文本写在它所属的位置更实用。

答案2

你可以解析包含以下格式的文件

label: caption text

使用包字符串

\begin{filecontents*}{captions.txt}
first: This is the first caption
third: This is the third caption (but second at file)
second: This is the second caption (but third at file)
\end{filecontents*}

\documentclass{article}
\usepackage{xstring}

\makeatletter
\newread\labelfile
\newcommand*{\ReadFromFile}[2][captions.txt]{%
  \@ifundefined{text@#1@2}{%
    \def\@labelfilename{#1}%
    \openin\labelfile #1
    \@process@line@from@captionfile
    \closein\labelfile
  }{}%
  \@nameuse{text@#1@#2}%
}
\newcommand*{\string@from@captionfile}{}
\newcommand*{\@process@line@from@captionfile}{%
  \ifeof\labelfile\else
    \readline\labelfile to\@string@from@captionfile
    \StrLen{\@string@from@captionfile}[\@string@length]%
    \ifnum \number\@string@length>1 % ignore empty lines
      \StrBefore{\@string@from@captionfile}{: }[\@firstpart]%
      \StrBehind{\@string@from@captionfile}{: }[\@secondpart]%
      \IfStrEq{\@firstpart}{}{%
        \typeout{Syntax error: `\@string@from@captionfile'}%
      }{%
        \expandafter\edef\csname text@\@labelfilename @\@firstpart\endcsname{%
          \noexpand\scantokens{\@secondpart}%
        }%
%        \expandafter\show\csname text@\@labelfilename @\@firstpart\endcsname% for debugging only
        \expandafter\expandafter\expandafter\@process@line@from@captionfile
      }%
    \fi
  \fi
}
\makeatother

\begin{document}
\listoffigures

\section{The Figures}
\begin{figure}[ht]
  \caption{\ReadFromFile{first}}
\end{figure}

\begin{figure}[ht]
  \caption{\ReadFromFile{second}}
\end{figure}

\begin{figure}[hb]
  \caption{\ReadFromFile{third}}
\end{figure}

\end{document}

文件中允许有空行(甚至不是空格!),这些行与标题文本一起出现。它们将被忽略。不符合上述语法的行(例如,后面缺少空格:)将显示语法错误消息并被忽略。在标题文本中可能找不到带有空格的\ReadFromFile{notfound}行,这将导致标题文本为空。您可以再次使用包为此添加测试。有关更多信息,请参阅包手册。notfoundxstring

相关内容