![\write 和 \ifmmode](https://linux22.com/image/318847/%5Cwrite%20%E5%92%8C%20%5Cifmmode.png)
这与我之前的问题(如果我理解正确的话,\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}
$