编译期间隐藏消息

编译期间隐藏消息

我在大型文档的每一页中多次使用带有\write18和 的宏。但在编译期间输出一条消息:\@@input\@@input

(filename)

这非常烦人,并且会淹没其他相关信息。

有没有办法让\@@input我的宏在编译过程中保持安静(我使用pdflatex)?

我现在有以下内容:

\makeatletter
\newcommand*{\gpNorm}[3][\jobname.eval]{%
  \edef\inp@t{#3}%
  \immediate\write18{gnuplot -e 'set print "#1"; print norm(\inp@t)'}%
  \everyeof{\noexpand}%
  \edef#2{\@@input #1 }%
}
\makeatother

我使用write18从 获得计算结果gnuplot。但是带有\@@inputkeep 输出(filename)消息的行。我可以使用其他东西来读取 的输出gnuplot吗?

使用方法:\gpNorm{\res}{1}将计算的结果赋给gnuplot\res

答案1

没有办法抑制

(/path/to/filename.tex ...)

\input每次原语通过打开要读入的文件进行操作时,终端上和 TeX 都会生成的日志文件中都会出现一条消息()当扫描到文件末尾时会生成匹配)。

此诊断信息来自 TeX 内部深处,无法通过宏更改行为。只有使用基元\font(当字体尚未加载到内存中时)或使用 和\openin读取的文件\read不会显示。


如果您知道该命令的输出gnuplot只有一行,那么您可以使用以下命令读取该单行\read

\documentclass{article}
\makeatletter
\newread\gnuplot@read
\newcommand\gpNorm[3][\jobname.eval]{%
  \immediate\write18{gnuplot -e 'set print "#1"; print norm(#3)'}%
  \openin\gnuplot@read=#1\relax
  \read\gnuplot@read to#2\relax
  \closein\gnuplot@read
}
\makeatother

\begin{document}
\gpNorm\foo{1+1}

\foo

\end{document}

PDF 文件中的输出是

0.977249868051821

而终端输出是

This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
 \write18 enabled.
entering extended mode
(./xoff.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2012-05-30, ngerman-x-2012-05-30, afrikaans, ancientgreek, ibycus, arabi
c, armenian, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danis
h, dutch, ukenglish, usenglishmax, esperanto, estonian, ethiopic, farsi, finnis
h, french, friulan, galician, german, ngerman, swissgerman, monogreek, greek, h
ungarian, icelandic, assamese, bengali, gujarati, hindi, kannada, malayalam, ma
rathi, oriya, panjabi, tamil, telugu, indonesian, interlingua, irish, italian,
kurmanji, latin, latvian, lithuanian, mongolian, mongolianlmc, bokmal, nynorsk,
 piedmontese, polish, portuguese, romanian, romansh, russian, sanskrit, serbian
, serbianc, slovak, slovenian, spanish, swedish, turkish, turkmen, ukrainian, u
ppersorbian, welsh, loaded.
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/size10.clo))
No file xoff.aux.
[1{/usr/local/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./xoff.aux) )</usr/local/texlive/2012/texmf-dist/fonts/type1/public/amsfonts/c
m/cmr10.pfb>
Output written on xoff.pdf (1 page, 11836 bytes).
Transcript written on xoff.log.

还有一种不同的方法,即利用pdftex和中提供的“管道输入”功能luatex,该功能也应包含在的下一版本中xetex。如果传递给的文件名\input\@@input在 LaTeX 中)以 开头|(并且-shell-escape处于活动状态),则将使用名称的其余部分作为命令行启动进程;标准输出被视为输入文件。

但是,在这种特殊情况下,没有什么可做的:如果命令行中有空格,则必须用双引号将整个“文件名”括起来,而用于指示gnuplot输出的内部引号会使解析器感到困惑。一种解决方法可能是使用 Bash 脚本,例如xoff-norm.sh,其中包含以下内容:

#!/usr/bin/env bash
/usr/bin/env gnuplot << EOF
set print "-"
print norm($1)
exit
EOF

这样你的文件就可以

\documentclass{article}
\usepackage{catchfile}

\makeatletter
\newcommand\gpNorm[2]{%
  \CatchFileEdef#1{"|bash ./xoff-norm.sh #2"}{\everyeof{\noexpand}\endlinechar\m@ne}}
}
\makeatother

\begin{document}
\gpNorm\foo{1+1}

\foo
\end{document}

我过去catchfile总是避免重新发明轮子。但这次,启动多个进程,而不是一个。请自行选择。

相关内容