扩展从文件读取的命令

扩展从文件读取的命令

我有一个文件,其中包含每行一个 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}

结果

相关内容