\expandafter 用法和普通 TeX 编程

\expandafter 用法和普通 TeX 编程

大家好,使用 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}

相关内容