假设 E1 是 LaTeX 中的一个表达式,其中一个条目是 x。假设 E2 是另一个表达式。如何用 E2 替换 x?
我可以将 E2 包裹在一定大小的盒子中,并让 LaTeX 用该盒子替换 x,而无需让 LaTeX 查看盒子内部并尝试重新排列其内部结构吗?
例如:如何用特定的 2*2 矩阵替换给定的 3*3 矩阵的元素?
到目前为止,答案本身都很有趣,但对我都不起作用。所以让我重申一下。假设在一个环境中,我可以毫无问题地放置文字 $x$,但我不能将矩阵或多行方程放在同一个位置,因为它与各种命令等冲突。我怎样才能让矩阵对程序的其余部分像 $x$ 一样起作用?就好像我必须在其他地方构建矩阵,将其放在一个盒子里,然后将其作为单个项目出售给 LateX,就好像它没有换行符一样。
答案1
是的,这是可能的,因为 (La)TeX 是一种基于宏的语言,这些宏是可以修改的。以第二个更具体的构造为例:“用特定的 2 x 2 矩阵替换给定 3 x 3 矩阵的元素。以下示例说明了这一点:
\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\begin{document}
\newcommand{\x}{1}
\[
\begin{bmatrix}
3 & 2 & 8 \\
5 & \x & 6 \\
9 & 4 & 7
\end{bmatrix}
\]
\renewcommand{\x}{\begin{array}{@{}cc@{}}1 & 1 \\ 1 & 1\end{array}}
\[
\begin{bmatrix}
3 & 2 & 8 \\
5 & \x & 6 \\
9 & 4 & 7
\end{bmatrix}
\]
\end{document}
在第一个 3 x 3 矩阵中,元素\x
定义为1
。矩阵被复制,元素被\x
重新定义为 2 x 2 数组。当然,甚至可以定义一个宏来排版 3 x 3 矩阵本身,并允许指定一个打印 的参数\x
:
\newcommand{\mymatrix}[1]{%
\begin{bmatrix}
3 & 2 & 8 \\
5 & #1 & 6 \\
9 & 4 & 7
\end{bmatrix}
}
装箱是替换物品的另一种选择。例如,使用
\newsavebox{\mybox}% storage box
\savebox{\mybox}{\hbox{$begin{bmatrix}
3 & 2 & 8 \\
5 & 1 & 6 \\
9 & 4 & 7
\end{bmatrix}$}}
让你现在做
\usebox{\mybox}
类似于使用宏。宏和装箱之间的区别在于,宏通常在上下文中展开,而装箱则在原地设置(或在定义时就格式固定)。
答案2
当 Knuth 设计 TeX 时,他提供了定义宏的功能,这大致相当于其他计算机语言中的函数或过程。在 Plain TeX 中,人们可以使用\def
其他构造,或者在 LaTeX 中使用\newcommand
(还有许多其他变体,但为了清晰起见,我们在此省略它们)。
LaTeX 还提供了\newenvironment
,这是定义环境的一个非常有用的构造。我们将使用此命令创建一种更灵活的方法,使我们能够排版任意数量的单元格和行。
输入将被捕获为,
\SetArray{llll}
\begin{Array}
\addrow{...}
...
\end{Array}
完整的 MWE 如下所示:
\documentclass{article}
\newcommand\addrow[1]{#1\\}
\newcommand\SetArray[1]{%
\newcommand\setarray{#1}
}
\newenvironment{Array}{%
\[ \left( \begin{array}{\setarray}}{
\end{array} \right)\]}
\begin{document}
\SetArray{llll}
\begin{Array}
\addrow{1&2&3&10}
\addrow{4&5&6&10}
\addrow{7&8&9&10}
\end{Array}
\end{document}
使用更灵活的命令,可以排版任意数量的单元格和行,并且命令名称可以具有与作者的操作相似的语义。
答案3
除了命令替换之外,如果你真的想用另一个字符串替换一个字符串,可以考虑使用相当新的stringstrings
包裹:
\convertword{string}{ring}{rong}
将扩展为strong
。