我想让 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}
行,这将导致标题文本为空。您可以再次使用包为此添加测试。有关更多信息,请参阅包手册。notfound
xstring