当美元符号被重新定义时为什么我无法从文件中读取数学表达式?

当美元符号被重新定义时为什么我无法从文件中读取数学表达式?

该代码运行良好(并[x=y]以数学模式打印):

\documentclass{article}
\newcommand\foo[1]{$[#1]$}
\begingroup
\catcode`\$=\active
\protected\gdef$#1${\foo{#1}}
\endgroup
\AtBeginDocument{\catcode`\$=\active}
\begin{document}
$x = y$
\end{document}

$[x=y]$但是,如果我从文件中读取相同的文本( ),则会失败:

\documentclass{article}
\newcommand\foo[1]{\input{a.tex}}
\begingroup
\catcode`\$=\active
\protected\gdef$#1${\foo{#1}}
\endgroup
\AtBeginDocument{\catcode`\$=\active}
\begin{document}
$x = y$
\end{document}

可以修复吗?

如果你想知道我试图实现什么:我希望美元符号在我的文档中比通常意义更大。我想用$...$我自己的命令包装每次使用\foo并添加额外的格式通过我使用的外部脚本对其进行解析\write18

答案1

像这样编辑。

\documentclass{article}
\newcommand\foo[1]{\catcode`\$=3 \input{h.tex}\catcode`\$\active}
\begingroup
\catcode`\$=\active
\protected\gdef$#1${\foo{#1}}
\endgroup
\AtBeginDocument{\catcode`\$=\active}
\begin{document}
$x = y$
\end{document}

假设 h.tex 包含此内容,将以数学模式$x=y$打印出来。x=y

答案2

您有两个选择:要么在您写出的文件中使用\(...\)(稍后读取),要么$在输入文件之前更改类别代码。

虽然我推荐第一种方法,但您可以按照以下方法执行后一种方法(以及如何删除在\input排版段落时产生的虚假空间)。

\begin{filecontents*}{\jobname-a.tex}
$[x=y]$
\end{filecontents*}

\documentclass{article}

\newcommand\foo[1]{\inputnodollar{\jobname-a.tex}}
\newcommand{\inputnodollar}[1]{\begingroup\catcode`$=3 \input{#1}\unskip\endgroup}

\begingroup
\catcode`$=\active
\protected\gdef$#1${\foo{#1}}
\endgroup
\AtBeginDocument{\catcode`$=\active}

\begin{document}

X$x = y$X

X$x = y$ X

\end{document}

在此处输入图片描述

如果没有的话,\unskip第一行公式后面会有一个空格,第二行公式后面会有两个空格。

如果\unskip你的输入文件只有一行,你可以设置\endlinechar为 -1

\newcommand{\inputnodollar}[1]{\begingroup\catcode`$=3 \endlinechar=-1 \input{#1}\endgroup}

相关内容