(线性)方程组的多列布局

(线性)方程组的多列布局

如何存档类似的安排(使用 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}编写方程式;大部分情况下,标记遗漏的列(+-=&例如,当一组方程超过xy、 和时,如果其下方的另一组方程超过、、、 和z,则需要在列&后添加一个。它也用于方程之间,以便将它们分开;在这里,您应该在第一行使用空格说明符zxyzw&[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,我们初始化\lets、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}\]

相关内容