编辑

编辑

我的脚本需要从一个辅助文件(testFileWriteReadExecute.yposIN.txt)读取一个命令,然后执行相同的命令,该命令实际上是对写入宏的调用,该宏将另一个命令写入第二个文件(testFileWriteReadExecute.yposOUT.txt)。

目前,它在 PDF 输出中生成命令,而不是执行它。在某个阶段,我曾做过类似的事情,但不幸的是,后来搞砸了。

testFileWriteReadExecute.yposin.txt 如下所示:

\writeVerse{A}{1}{F}\comment{30580738}\endcomment
\writeVerse{A}{1}{L}\comment{29138946}\endcomment
\writeVerse{A}{2}{F}\comment{29138946}\endcomment
\writeVerse{A}{2}{L}\comment{27566082}\endcomment
\writeVerse{A}{3}{F}\comment{27566082}\endcomment
\writeVerse{A}{3}{L}\comment{25993218}\endcomment

梅威瑟:

\documentclass[pagesize=pdftex, fontsize=10]{scrbook}
\usepackage[paperwidth=11.2cm, paperheight=17.4cm, top=1cm,bottom=1cm, left=1cm, right=1cm]{geometry}
\usepackage{fontspec}

\AtBeginDocument{%
    \newwrite\yposoutputfile%
    \openout\yposoutputfile=\jobname.yposout.txt%
}
\AtEndDocument{%
    \closeout\yposoutputfile%
}

\newcommand\writeVerse[3][]{%
  \writelines{#1}{#2}{#3}%
}

% Write the position to file.
\def\writelines#1#2#3{%
  \pdfsavepos%
    \write\yposoutputfile{%
    \string\writeVerse%
    \string{#1\string}%
    \string{#2\string}%
        \string{#3\string}%
        \string\comment\string{\the\pdflastypos\string}\string\endcomment%
    }%
}

% Open the file to read the commands.
\def\fromFile{
  \newread\yposinputfile%
  \openin\yposinputfile=\jobname.yposin.txt%
    \readline\yposinputfile to \fromFileLine%
  \closein\yposinputfile%
  \fromFileLine
}

\begin{document}
\fromFile %\writeVerse{A}{1}{F}
 LIBRO de la generación de Jesucristo, hijo de David, hijo de Abraham. \fromFile %\writeVerse{A}{1}{L}
\writeVerse{A}{2}{F} \textbf{2}~Abraham engendró á Isaac: é Isaac engendró á Jacob: y Jacob engendró á Judas y á sus hermanos:\writeVerse{A}{2}{L}
\writeVerse{A}{3}{F} \textbf{3}~Y Judas engendró de Thamar á Phares y á Zara: y Phares engendró á Esrom: y Esrom engendró á Aram:\writeVerse{A}{3}{L}
\end{document}

编辑

我想要的基本概念很简单。

  1. XeLaTeX脚本从一个文本文件中抓取一行恰好是TeX命令的内容,即\writeVerse{A}{1}{F}
  2. 它将该命令放置在文档的特定位置,该命令在那里被执行/扩展而不是打印。
  3. 该命令是对宏的调用,而宏又写入另一个文件。

编辑2:

由于最接近的答案是 egreg 的这个答案,我会接受它,尽管它没有回答我的问题的基本内容。这似乎是 TeX 的一个限制。

答案1

我真的不明白\fromFile应该怎么做。不过,您可以通过在标准文件中执行写入操作.aux,然后在文档开头覆盖旧的“ypos”文件来避免文件混乱。

\documentclass[pagesize=pdftex, fontsize=10]{scrbook}
\usepackage[
  paperwidth=11.2cm,
  paperheight=17.4cm,
  top=1cm,bottom=1cm,
  left=1cm,
  right=1cm]{geometry}
%\usepackage{fontspec}

% Allocate an output and an input stream
\newwrite\yposfileout
\newread\yposfilein

% If the file has been written, open it for reading
\AtBeginDocument{%
  \immediate\closeout\yposfileout
  \IfFileExists{\jobname.ypos.txt}
    {\openin\yposfilein=\jobname.ypos.txt}
    {\let\fromFile\relax}
}

% Write the position to file.
\makeatletter
\def\writelines#1#2#3{%
  \pdfsavepos%
  \write\@auxout{%
    \string\rewriteVerse{%
      \string\writeVerse{#1}{#2}{#3}%
      \string\comment\string{\the\pdflastypos\string}\string\endcomment
    }}%
}
\newif\if@writeverseopened
% when the `.aux` file is being read in at begin document, write out a new ypos file
\def\rewriteVerse#1{%
  \if@writeverseopened\else
    \immediate\openout\yposfileout=\jobname.ypos.txt
    \@writeverseopenedtrue
  \fi
  \immediate\write\yposfileout{\unexpanded{#1}}%
}
% Do nothing when the aux file is read in at end document
\AtEndDocument{\let\rewriteVerse\@gobble}

% Read the commands from the ypos file
\def\fromFile{%
  \readline\yposfilein to \fromFileLine
  \texttt{\fromFileLine}
}
\makeatother

% \writeVerse has an optional argument and two mandatory ones
\newcommand\writeVerse[3][]{%
  \writelines{#1}{#2}{#3}%
}


\begin{document}
\fromFile \writeVerse[A]{1}{F} LIBRO de la generación de Jesucristo,
hijo de David, hijo de Abraham. \fromFile \writeVerse[A]{1}{L}
\writeVerse[A]{2}{F} \textbf{2}~Abraham engendró á Isaac: é Isaac
engendró á Jacob: y Jacob engendró á Judas y á sus
hermanos:\writeVerse[A]{2}{L} \writeVerse[A]{3}{F} \textbf{3}~Y Judas
engendró de Thamar á Phares y á Zara: y Phares engendró á Esrom: y
Esrom engendró á Aram:\writeVerse[A]{3}{L}
\end{document}

您可以使用两个文件,只要您的脚本将前一个输出文件的名称更改为输入文件。

\documentclass[pagesize=pdftex, fontsize=10]{scrbook}
\usepackage[
  paperwidth=11.2cm,
  paperheight=17.4cm,
  top=1cm,bottom=1cm,
  left=1cm,
  right=1cm]{geometry}
\usepackage{atveryend,pdftexcmds}

\newwrite\yposfileout
\newread\yposfilein
\AtBeginDocument{%
  \IfFileExists{\jobname.yposin.txt}
    {\openin\yposfilein=\jobname.yposin.txt}
    {\let\fromFile\relax}
  \immediate\openout\yposfileout=\jobname.yposout.txt
}

% Write the position to file.
\def\writelines#1#2#3{%
  \pdfsavepos%
  \write\yposfileout{%
    \string\writeVerse{#1}{#2}{#3}%
    \string\comment\string{\the\pdflastypos\string}\string\endcomment
    }%
}
% Open the file to read the commands.
\def\fromFile{%
  \readline\yposfilein to \fromFileLine
  \texttt{\fromFileLine}
}

\makeatletter
\AtVeryEndDocument{%
  \closein\yposfilein
  \immediate\closeout\yposfileout
  \ifnum\pdf@shellescape>\z@
    \immediate\write18{mv \jobname.yposout.txt \jobname.yposin.txt}
  \fi
}
\makeatother

\newcommand\writeVerse[3][]{%
  \writelines{#1}{#2}{#3}%
}


\begin{document}
\fromFile \writeVerse[A]{1}{F} LIBRO de la generación de Jesucristo,
hijo de David, hijo de Abraham. \fromFile \writeVerse[A]{1}{L}
\writeVerse[A]{2}{F} \textbf{2}~Abraham engendró á Isaac: é Isaac
engendró á Jacob: y Jacob engendró á Judas y á sus
hermanos:\writeVerse[A]{2}{L} \writeVerse[A]{3}{F} \textbf{3}~Y Judas
engendró de Thamar á Phares y á Zara: y Phares engendró á Esrom: y
Esrom engendró á Aram:\writeVerse[A]{3}{L}
\end{document}

\fromFile每次调用时读取输入文件的一行。

如果我使用 运行文件-shell-escape,则该\write18指令将负责下次运行时的名称切换。当然,您可以使用脚本来执行此操作。

相关内容