Подавить сообщение во время компиляции

Подавить сообщение во время компиляции

Я использую макрос с \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 ...)

сообщение на терминале и в файле журнала, который генерируется TeX каждый раз, когда \inputпримитив открывает файл для чтения (соответствие )генерируется при сканировании конца файла).

Эта диагностическая информация исходит из глубин 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избегал изобретать велосипед. Но в этом случае,двапроцессы запускаются вместо одного. Выбирайте.

Связанный контент