![表格环境中 \renewcommand 的作用域](https://linux22.com/image/372050/%E8%A1%A8%E6%A0%BC%E7%8E%AF%E5%A2%83%E4%B8%AD%20%5Crenewcommand%20%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F.png)
我正在通过 pandoc 从 markdown 创建 tex 文件,为了克服固有的标记限制,我想尝试重新定义latex 模板中的\emph
和\textbf
宏,以便更好地控制格式。例如,在文档的特定部分,我希望**text**
变成{\bfseries\scshape text}
。它运行良好,但\renewcommand
在表格环境中范围非常有限:我最终不得不将它添加到每一行。这是正常行为吗?有没有解决方法可以将范围扩展到整个表格环境?
\documentclass{article}
\newcommand{\fb}[1]{{\scshape#1}}
\begin{document}
\begin{tabular}{l}
\textbf{a}a\\
\renewcommand*{\textbf}[1]{\fb{#1}}\textbf{a}a\\
\textbf{a}a\\
\textbf{a}a
\end{tabular}
\end{document}
笔记:我知道我可以在 markdown 源中简单地使用原始 tex 标记,但为了以作者为中心的易读性,我想避免这种替代策略。
答案1
所有单元格都将其内容保存在本地。\global
全局定义它:
\documentclass{article}
\newcommand\fb[1]{{\scshape#1}}
\begin{document}
\begin{tabular}{l}
\textbf{a}a\\
\global\let\textbf\fb \textbf{a}a\\
\textbf{a}a\\
\textbf{a}a
\end{tabular}
\end{document}
但是,覆盖现有的 LaTeX 宏并不是一个好主意
答案2
正如 Zarko 所说,如果可以的话最好不要弄乱标准的乳胶宏,但是,我意识到如果您想修改自动生成的输出(例如 pandoc 的输出),有时您别无选择。
我不确定这是否是一种选择,但最简单的方法是使用tabular
“本地”重新定义的自定义环境\textbf
。使用此方法,这是您修改后的 MWE:
\documentclass{article}
\newcommand{\fb}[1]{{\scshape#1}}
\newenvironment{Tabular}[1]%
{\renewcommand*{\textbf}[1]{\fb{##1}}\tabular{#1}}%
{\endtabular}
\begin{document}
\begin{Tabular}{l}
\textbf{a}a\\
\textbf{a}a\\
\textbf{a}a
\end{Tabular}
\textbf{a}
\end{document}
产生预期的结果
要以最少的努力将其应用于所有表格环境,您可以使用:
\documentclass{article}
\newcommand{\fb}[1]{{\scshape#1}}
\let\realTabular\tabular% save real tabular environment
\let\realEndTabular\endtabular% save end real tabular environment
\renewenvironment{tabular}[1]%
{\renewcommand*{\textbf}[1]{\fb{##1}}\realTabular{#1}}
{\realEndTabular}
\begin{document}
\begin{tabular}{l}
\textbf{a}a\\
\textbf{a}a\\
\textbf{a}a
\end{tabular}
\textbf{a}
\end{document}
输出是一样的。
顺便说一句,\renewcommand*{\textbf}[1]{\fb{##1}}
你可以使用\let\textbf\fb