与纯 TeX 程序交互

与纯 TeX 程序交互

是否可以在纯 TeX 中从 stdin 读取?我发现在 LaTeX 中可以使用\typein(参见这里),然而 TeX 不支持此功能。还有其他选择吗?

MWE 在乳胶

\documentclass{article}
\begin{document}
    \typein[\name]{What is your name?}%
    Hello, ``\name''
\end{document}"

这是 pdfTeX,版本 3.14159265-2.6-1.40.18(TeX Live 2017/Debian)(预加载格式=pdfl

答案1

当你说\read<number> to \foo数字与打开的输入流不对应并且数字为非负数时,TeX 会提示你

\foo=

如果数字大于 15,则无法打开流,因此 16 以上的任何整数都可以。如果使用负数,则不会显示提示,但 TeX 仍会等待输入。

存在尾随空格的问题,它来自您按回车键插入的行尾。可以通过将行尾字符设置为类别代码 9 来解决此问题。

\def\prompt#1{%
  \begingroup
  \catcode`\^^M=9 % ignore the end-of-line
  \read 20 to #1%
  \expandafter\endgroup
  \expandafter\def\expandafter#1\expandafter{#1}%
}

\prompt\foo

\show\foo

控制台输出是

\foo=xyz
> \foo=macro:
->xyz.
l.11 \show\foo

?

在第一行中,TeX 提示输入\foo;我输入了xyz并按回车键。的输出\show告诉我们没有空格。分组限制了类别代码的变化。使用链,\expandafter我们还可以\foo在当前组之外定义关闭它。

答案2

\write 18与输出类似,以下内容解决了我的问题。

\read 18 to \name

来自 stdin 的内容出现在 中\name,但末尾出现了一个空格。

相关内容