为什么\message{\input|"texlua ..."}
和\message{\input|"texlua ..." }
的结果截然不同?请注意}
第二种情况之前的多余空格。
下面是要编译的最小示例pdftex --shell-escape
。
% Create an empty file \jobname.lua
%
\immediate\openout5\jobname.lua
\immediate\closeout5
%
% Only difference between \A and \B: a trailing space.
% Set \everyeof to allow \input within \edef.
%
\everyeof{\noexpand}
\edef\A{\input|"texlua \jobname.lua"}
\edef\B{\input|"texlua \jobname.lua" }
%
% Display the meanings in the terminal.
%
\newlinechar=10
\message
{%
^^J^^J%
\meaning\A % => macro:->Script file <jobname>.lua
^^J^^J%
\meaning\B % => macro:->\par
^^J^^J%
}
\bye
答案1
我认为这是因为引号不是参数括号,只是用来保护空格的引号。如果您运行以下命令:
\input "abc"d
\input "abc" d
\bye
您将收到以下错误消息(当然假设文件不存在):
! I can't find file `abcd'.
l.14 \input "abc"d
和
! I can't find file `abc'.
l.16 \input "abc"
d
例如使用 xetex\XeTeXinputencoding "utf8"cde
也会导致Unknown encoding utf8cde
。您必须使用空格来真正结束输入。
根据评论中的讨论进行补充:
这意味着该\edef\A
案例的处理方式可能如下:\edef\A{\input|"texlua \jobname.lua"}\relax
=> \edef\A{Script file <jobname>.lua>} not found
=>\A
是Script file <jobname>.lua
并且not found
是排版的。