该代码运行良好(并[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}