我的脚本需要从一个辅助文件(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}
编辑
我想要的基本概念很简单。
- 该
XeLaTeX
脚本从一个文本文件中抓取一行恰好是TeX
命令的内容,即\writeVerse{A}{1}{F}
- 它将该命令放置在文档的特定位置,该命令在那里被执行/扩展而不是打印。
- 该命令是对宏的调用,而宏又写入另一个文件。
编辑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
指令将负责下次运行时的名称切换。当然,您可以使用脚本来执行此操作。