我有一个文件,其中包含每行一个 latex 命令列表。现在我想逐行读取此文件并自动执行/扩展宏。我尝试了以下操作,但这只会打印出命令而不是执行它。
\makeatletter
\newread\myread
\newcount\linecnt
\openin\myread=testfile.tex
\@whilesw\unless\ifeof\myread\fi{%
\advance\linecnt by \@ne
\readline\myread to \line
\line
}
\makeatother
我该如何解决这个问题?我不认为有类似的东西\forceexpand\line
。我怎样才能忽略中的评论testfile.tex
?
编辑:
正如 Joseph Wright 在评论中指出的那样,我应该使用\read
而不是\readline
。这也会忽略评论,但并不能完全解决我的评论问题。为了说明这一点,以下是我提出这个问题的最初动机:
我想在不同的文档中测试 xelatex 中的多种字体(这些文档在后面的步骤中通过 pdfpages 放在一起,但这太复杂了,在这里无关紧要)。但是对于这种情况,我希望有一个包含我想要尝试的字体列表的单个文件,如下所示(testfile.tex
):
\setmainfont{font1}
%\setmainfont{font2}
\setmainfont{font3}
然后我有一个文档文件,如下所示:
\documentclass{article}
\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
\newcommand{\testtext}{Some Text}
\begin{document}
\makeatletter
\newread\myread
\newcount\linecnt
\openin\myread=testfile.tex
\@whilesw\unless\ifeof\myread\fi{%
\advance\linecnt by \@ne
\read\myread to \line
\line
\testtext
\newline %\newpage
}
\makeatother
\end{document}
这应该输出两次的内容\testtext
,一次使用字体 1,一次使用字体 3,使用字体 2 的注释条目应该被完全忽略(而不是使用字体 1 打印两次文本)。因此,我应该在循环中以某种方式检测该行是否是注释,并且在这种情况下不\testtext
执行\newline
。
答案1
如果%
在想要省略的行中 位于最前面,则只需测试刚刚读取的行是否为空;\endlinechar
在读取文件时设置为 -1 可避免附加的行尾变成空格或\par
。
\begin{filecontents*}{\jobname.tst}
\fontspec{Linux Libertine O}
%\fontspec{Old Standard}
\fontspec{TeX Gyre Cursor}
\end{filecontents*}
\documentclass{article}
\usepackage[a4paper,margin=.5cm]{geometry}
\usepackage{fontspec}
\newcommand{\testtext}{Some Text \fontname\font}
\setlength{\parindent}{0pt}
\begin{document}
\makeatletter
\newread\myread
\newcount\linecnt
\begingroup\endlinechar=\m@ne
\openin\myread=\jobname.tst
\loop\unless\ifeof\myread
\advance\linecnt by \@ne
\read\myread to \line
\ifx\line\@empty\else
{(\number\linecnt) \line\testtext}%
\par %\newpage
\fi
\repeat
\endgroup
\makeatother
\end{document}
使用\loop...\repeat
比 更简单\@whilesw
。
答案2
David Carlisle 被删除的想法也有效\input{testfile}
。数据确实已经包含 TeX 宏标记。我们只需要定义宏来完成我们想要完成的工作。以下修改egreg 的示例:
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.tst}
\fontspec{DejaVu Sans}
\fontspec{Linux Libertine O}
%\fontspec{Old Standard}
\fontspec{TeX Gyre Cursor}
\end{filecontents*}
\documentclass{article}
\usepackage[a4paper,margin=.5cm]{geometry}
\usepackage{fontspec}
\newcommand{\testtext}{Some Text}
\setlength{\parindent}{0pt}
\begin{document}
\begingroup
\let\OrgFontSpec\fontspec
\renewcommand*{\fontspec}[2][]{%
(\the\inputlineno) %
\begingroup
\OrgFontSpec[{#1}]{#2}%
\testtext\ [#2] \fontname\font
\endgroup
\par
% \newpage
}%
\input{\jobname.tst}%
\endgroup
\end{document}