如何存档类似的安排(使用 ams*、aligned、multicol 等)
1.2.3 解下列方程组:
a) x - 2y - 4z = 1 b) -23x + 43y = 22
3x - y - z = -1 x - 5y = -1
x - 11y + 22z = 110
c) x + y - 4z - u = 1 d) -23x + 43y -t = 2
10x - y - 5z + 6u = -1 x - 5y + 6t = -10
x - 11y + 2z - 22u = 11 5x - 8y - 6t = -100
x - 18y + 8z + 2u = -6
使用“全双工”,即垂直和水平对齐?
答案1
我会使用alignat*
,而不是array
,因为它被设计用于处理像+
和 这样的运算符周围的空格=
。这会导致很多代码变得丑陋,看起来像x &-{}& 2y &-{}& 4z && &={}& 1
(其中 跳过&&
一列),这也是让所有现有解决方案看起来丑陋的原因。但我们可以通过一点 catcode 技巧来消除这种噪音。如果我们制作+
、-
和=
活动字符,那么它们可以扩展到&+{}&
、&-{}&
和&={}&
任何地方。我们只需要存储纯文本版本,这样我们就可以写-1
。而在这样做的同时,我们每次都有一个 s 时大多会想要两个&
s ,也许中间有一些空格。那么为什么我们不制作&
一个扩展为 的活动字符呢&&
?完成所有这些操作并处理我所忽略的所有混乱细节后,我们将得到以下内容:
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{environ}
\makeatletter
\newcommand{\LinearSystems@SetupLets}{%
\let\col=&%
\let\+=+%
\let\-=-%
\let\===%
}
\newcommand{\LinearSystems@SetupCatcodes}{%
\catcode`\&=\active
\catcode`\+=\active
\catcode`\-=\active
\catcode`\==\active
}
\newcommand{\LinearSystems@Setup}{}
\begingroup
\LinearSystems@SetupCatcodes
\gdef\LinearSystems@Setup{%
\LinearSystems@SetupLets
\LinearSystems@SetupCatcodes
\newcommand&[1][0pt]{\col\hspace{##1}\col}%
\def+{\col\+{}{}\col}%
\def-{\col\-{}{}\col}%
\def={\col\={}{}\col}%
}
\endgroup
\NewEnviron{LinearSystems}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}
\let\LinearSystems@OriginalBegin\LinearSystems
\def\LinearSystems{\LinearSystems@Setup\LinearSystems@OriginalBegin}
\makeatother
\begin{document}
\begin{LinearSystems}{11}
\text{a)} &[1em] x - 2y - 4z & = 1 &[4em] \text{b)} &[1em] \-23x + 43y & = 22 \\
& 3x - y - z & = \-1 & & x - 5y & = \-1 \\
& x - 11y + 22z & = 110 \\
\\
\text{c)} & x + y - 4z - u = 1 & \text{d)} & \-23x + 43y - t = 2 \\
& 10x - y - 5z + 6u = \-1 & & x - 5y + 6t = \-10 \\
& x - 11y + 2z - 22u = 11 & & 5x - 8y - 6t = \-100 \\
& x - 18y + 8z + 2u = \-6
\end{LinearSystems}
\end{document}
这将产生以下输出:
的单个参数比输出中的列数少一。然后,您只使用、和来\begin{LinearSystems}
编写方程式;大部分情况下,标记遗漏的列(+
-
=
&
例如,当一组方程超过x
、y
、 和时,如果其下方的另一组方程超过、、、 和z
,则需要在列&
后添加一个。它也用于方程之间,以便将它们分开;在这里,您应该在第一行使用空格说明符z
x
y
z
w
&[space]
仅有的(因为所有未来的行都将与其对齐)。您必须使用\-
文字减号(以及\+
文字加号、\=
文字等号和\col
等同于单身的传统&
);如果这对您来说太烦人,因为您有很多负数,您可以添加,比如,\let~=-
到\LinearSystems@SetupLets
,并写~3
而不是-3
。
代码并不特别混乱或糟糕,但如果你以前从未见过类似的东西,它还是有点奇怪的。基本思路如下。首先,我们定义一个命令,运行时,它会创建各种方法来访问字符的原始含义。在类别代码具有其原始含义的情况下执行此操作很重要,因为在命令定义之后,类别代码会被冻结。然后我们定义一个宏来更改所有类别代码,因为我们将需要它两次。
接下来,我们使用\newcommand
来确保\LinearSystems@Setup
没有定义。然后我们创建一个组,并更改所有的 catcode。我们需要在这里更改它们,以便宏\LinearSystems@Setup
能够包含\def+{\col\+{}{}\col}
等;否则,由于 catcode 在 处被冻结定义有时,TeX 会因为尝试定义非活动的 而感到困惑+
。由于 是\LinearSystems@Setup
在组内定义的,因此必须全局定义才能在组外使用;我们不能(据我所知)使用\newcommand
,\global
这就是为什么\newcommand
用来检查组外的原因。在 内\LinearSystems@Setup
,我们初始化\let
s、catcode 和活动字符。
\NewEnviron
最后,我们创建一个新环境。这里必须使用,因为\begin{alignat*}
提前扫描以查找\end{alignat*}
;\newenvironment
会隐藏\end{alignat*}
,从而破坏事物。但是,由于\begin{LinearSystems}
现在提前扫描以查找\end{LinearSystems}
,它会破坏 catcode 分配,这必须完成前扫描。这就是为什么我们重新定义\LinearSystems
(由 调用\begin{LinearSystems}
)——让它重新定义 catcodes第一的并向前扫描第二。
不过,经过所有这些工作,环境中的代码LinearSystems
看起来(在我看来)确实很棒:-)(主要是,它的“与”号要少得多。)
另外,如果你没有并且无法安装该environ
软件包,你可以使用以下技巧。在和LinearSystems
之间定义一个环境,如下所示:\makeatother
\makeatletter
\newenvironment{LinearSystems}{\LinearSystems@setup}{}
然后,在您的文档中,而不是
\begin{LinearSystems}{\N}
% ...
\end{LinearSystems}
你必须写
\begin{LinearSystems}\begin{alignat*}{\N}
% ...
\end{alignat*}\end{LinearSystems}
遗憾的是,它不是那么好,但它应该可以正常工作。
答案2
好的。所以... 也来一个 Plain 的,这样我们都可以开心了(肯定和 Antal 的正好相反):
{
\tabskip=3pt
\openup1\jot
\def\+{&+&}
\def\-{&-&}
\def\={&=&}
\def\eqpart#1{\qquad\hbox{#1)}\enspace}
\halign{#\enspace&&\hfil$#$\cr
a) & & & x \- 2y \- 4z \= 1&\eqpart b & & &-23x \+ 43y \= 22 \cr
& & & 3x \- y \- z \= -1& & & & x \- 5y \= -1 \cr
& & & x \- 11y \+ 22z \= 110 \cr\cr
c) & x \+ y \- 4z \- u \= 1&\eqpart d &-23x \+ 43y \- t \= 2 \cr
&10x \- y \- 5z \+ 6u \= -1& & x \- 5y \+ 6t \= -10 \cr
& x \- 11y \+ 2z \- 22u \= 11& & 5x \- 8y \- 6t \=-100 \cr
& x \- 18y \+ 8z \+ 2u \= -6 \cr
}
}
\bye
答案3
如上所述,最佳对齐是通过array
环境完成的。下面是更详细的版本。
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{array}
\begin{document}
\[
\setlength{\arraycolsep}{1.5pt}
\begin{array}{@{}>{$}c<{$}@{\quad}rcrcrcrcr@{\qquad}>{$}c<{$}@{\quad}rcrcrcr@{}}
a) & & & x & - & 2y & - & 4z & = & 1 & b) & & & -23x & + & 43y & = & 2 \\ & & & 3x & - & y & - & z & = & -1 & & & & x & - & 5y & = & -1 \\ & & & x & - & 11y & + & 22z & = & 110 & & & & & & & & \\[2\jot]
c) & x & + & y & - & 4z & - & u & = & 1 & d) & -23x & + & 43y & - & t & = & 2 \\ & 10x & - & y & - & 5z & + & 6u & = & -1 & & x & - & 5y & + & 6t & = & -10 \\ & x & - & 11y & + & 2z & - & 22u & = & 11 & & 5x & - & 8y & - & 6t & = & -100 \\ & x & - & 18y & + & 8z & + & 2u & = & -6 & & & & & & & &
\end{array}
\]
\end{document}
但这非常繁琐,所以你必须思考努力和结果的关系。
答案4
我不确定你想要多少对齐。对于以下内容,我假设你想在每个单项式、每个算术运算时对齐,并且所有单项式都要齐平。那么,array
如果你需要对对齐进行如此精细的控制,那么你应该使用环境。
\[\begin{array}{rrcrcrcrcrrrcrcrcr}
a)&&& x &-& 2y&-& 4z&=& 1 & \qquad b)&&& -23x&+& 43y&=&22\\
&&& 3x&-& y&-& z&=& -1 &&&& x&-& 5y&=&-1\\
&&& x &-&11y&+&22z&=&110 \\
\\
c)& x&+& y&-& 4z&-& u&=& 1& \qquad d)& -23x&+& 43y&-& t&=& 2\\
& 10x&-& y&-& 5z&+& 6u&=& -1&& x&-& 5y&+& 6t&=& -10\\
& x&-& 11y&+& 2z&-&22u&=& 11&& 5x&-& 8y&-& 6t&=& -100\\
& x&-& 18y&+& 8z&+& 2u&=& -6
\end{array}\]