\write 和 \ifmmode

\write 和 \ifmmode

这与我之前的问题(如果我理解正确的话,\write工作原理有点像\edef)。

考虑以下代码:

\documentclass[varwidth,convert={size=640}]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{fancyvrb}
\begin{document}

\newwrite\foo
\immediate\openout\foo=foo.txt
$\immediate\write\foo{\ifmmode\noexpand\true\else\noexpand\false\fi}$ 
\immediate\closeout\foo

\VerbatimInput{foo.txt}

\end{document}

在此处输入图片描述

我想写入\true文件。我该怎么做?

答案1

有一些变化。

的乐趣\expandafter

\documentclass[varwidth,convert={size=640}]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{fancyvrb}
\begin{document}

\newwrite\foo
\immediate\openout\foo=foo.txt
$\immediate\expandafter\write\expandafter\foo\expandafter{%
  \ifmmode\noexpand\true\else\noexpand\false\fi}$ 
\immediate\closeout\foo

\VerbatimInput{foo.txt}

\end{document}

结果

在数学模式下,在执行之前会\expandafter进行扩展。\ifmmode\write

扩展宏定义:

$\edef\result{\ifmmode\string\true\else\string\false\fi}
  \immediate\write\foo{\result}$

或者可以将整个表达式放在\edef

$\edef\next{%
  \immediate\write\foo{\ifmmode\string\true\else\string\false\fi}%
}\next$

答案2

在里面\write,TeX 处于“无模式”,而不是 hmode、数学模式,ETC。因此你必须将测试移到\write

$
  \ifmmode
     \immediate\write\foo{\string\true}%
  \else
    \immediate\write\foo{\string\false}%
  \fi}
$ 

相关内容