大家好,使用 TeX 的人,
实际上,我想用纯 TeX 编写一个 LaTeX 宏,以便包含带有单独修改的源代码示例,例如删除注释和 LaTeX 文档中的前 21 个字符。到目前为止,我的代码如下所示:
\documentclass{article}
\edef\hashmark{\string#}
\def\getfirst#1#2\getfirst{\string#1}
\def\gobble#1#2{\expandafter#2}
\newread\myread
\begin{document}
\openin\myread=complete.txt
\newcount\linecount
\global\linecount1
\loop
\unless\ifeof\myread
\read\myread to \myinput
\if\hashmark\expandafter\getfirst\detokenize\expandafter{\myinput}\getfirst
\relax
\else
\newcount\position
\global\position1
{
\loop
\unless\ifnum\position>21
\edef\myinput{\expandafter\gobble\myinput}
\global\advance\position1
\repeat
}
\fi
\global\advance\linecount1
\repeat
\closein\myread
\end{document}
这会导致错误消息! Paragraph ended before \gobble was complete.
不幸的是,这已经是我第二次在这里寻求帮助了,因为我缺乏开发 TeX 和解释错误消息的经验。
使用 TeX 处理文本输入的所有这些困难让我怀疑,使用 TeX 来操作和修剪我的源代码文件是否真的有意义,而不是使用 sed、Perl、Python 或任何其他我有更多经验且易于进行文本操作的编程语言。
任何对此考虑的贡献都将受到赞赏。
答案1
问题的根源是输入文件中的空行以及最后一行。
所以,是的,我应该添加一个典型的输入文件作为指向这个问题的指针。很抱歉我错过了这一点。
\par
据我所知,检查以以下开头的行似乎可以解决这个问题:
\documentclass{article}
\def\apar{\par}
\edef\hashmark{\string#}
\def\getfirst#1#2\getfirst{\string#1}
\def\gobble#1#2{\expandafter#2}
\newread\myread
\begin{document}
\openin\myread=complete.txt
\newcount\linecount
\global\linecount1
\loop
\unless\ifeof\myread
\read\myread to \myinput
\if\hashmark\expandafter\getfirst\detokenize\expandafter{\myinput}\getfirst
\relax
\else
\xdef\mystring{\expandafter\myinput}
\ifx\mystring\apar
\relax
\else
\newcount\position
\global\position1
{
\loop
\unless\ifnum\position>1
\xdef\mystring{\expandafter\gobble\mystring}
\global\advance\position1
\repeat
}
\fi
\mystring
\fi
\global\advance\linecount1
\repeat
\closein\myread
\end{document}