我正在写一些关于线性代数的笔记,为了简化我的工作,我决定使用该systeme
软件包。当我发现 systeme 没有内置的用点和非数字系数编写方程组的功能时,我决定使用建议的修复方法这个答案。
我需要编写特定方程组行约简的完整过程,我之前在 align* 环境中使用 cases 环境编写过。但是 cases 环境无法按预期对齐系数,尽管每个系统都恰好位于我想要的位置。本文建议的修复方法在 align* 环境中使用时会产生错误。我该怎么办?
错误的测试样本:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xstring}
\def\typesystem#1{%
\begingroup\expandarg
\baselineskip=1.5\baselineskip% 1.5 to enlarge vertical space between lines
\StrSubstitute{\noexpand#1}+{&+&}[\tempsystem]%
\StrSubstitute\tempsystem={&=&}[\tempsystem]%
\StrSubstitute\tempsystem,{\noexpand\cr}[\tempsystem]%
\vcenter{\halign{&$\hfil\strut##$&${}##{}$\cr\tempsystem\crcr}}%
\endgroup
}
\begin{document}
\begin{align*}
\left\{\typesystem{3x + 2y = 1, x - 3y = 2}\right.
\end{align*}
\end{document}
其结果是:
! Argument of \@xs@next has an extra }.
<inserted text>
\par
l.20 \end{align*}
我的情况是每个系统都在所需的位置,但是它们内部的系数没有对齐(使用 align* 和 cases):
答案1
我会继续systeme
使用\typesystem
是非常有錯誤。
无论如何,再加一副牙套就可以了:
\documentclass{article}
\usepackage{amsmath,xstring}
\newcommand\typesystem[1]{%
\begingroup\expandarg
\linespread{1.5}\selectfont
\StrSubstitute{\noexpand#1}+{&+&}[\tempsystem]%
\StrSubstitute\tempsystem-{&-&}[\tempsystem]%
\StrSubstitute\tempsystem={&=&}[\tempsystem]%
\StrSubstitute\tempsystem{\noexpand\missing}{{}&&}[\tempsystem]%
\StrSubstitute\tempsystem,{\noexpand\cr}[\tempsystem]%
\left\{\vcenter{\halign{&$\hfil\strut##$&${}##{}$\cr\tempsystem\crcr}}\right.%
\endgroup
}
\newcommand\minus{{-}}
\newcommand{\missing}{}
\begin{document}
\begin{alignat*}{2}
{\typesystem{
2x_1 - x_2 - x_3 = 1,
4x_1 - 3x_2 + x_3 = 0,
\minus x_1 + x_2 + 2x_3 = \minus2
}}
&& {}\xrightarrow{L_2\rightarrow L_2 - 2L_1}{}
&{\typesystem{
2x_1 - x_2 - x_3 = 1,
{} - x_2 + 3x_3 = \minus2,
\minus x_1 + x_2 + 2x_3 = \minus2
}}
\\
&& {}\xrightarrow{L_1\leftrightarrow L_3}{}
&{\typesystem{
\minus x_1 +x_2 +2x_3 = \minus2,
{} - x_2 +3x_3 = \minus2,
2x_1 -x_2 -x_3 = 1
}}
\\
&& {}\xrightarrow{L_3\rightarrow L_3 + 2L_1}{}
&{\typesystem{
\minus x_1 +x_2 +2x_3 = \minus2,
{} - x_2 +3x_3 = \minus2,
\missing x_2 +3x_3 = \minus3
}}
\end{alignat*}
\end{document}
和systeme
:
\documentclass{article}
\usepackage{amsmath,systeme}
\begin{document}
\begin{alignat*}{2}
\systeme{
2x_1 - x_2 - x_3 = 1,
4x_1 - 3x_2 + x_3 = 0,
-x_1 + x_2 + 2x_3 = -2
}
&& {}\xrightarrow{L_2\rightarrow L_2 - 2L_1}{}
&\systeme{
2x_1 - x_2 - x_3 = 1,
-x_2 + 3x_3 = -2,
-x_1 + x_2 + 2x_3 = -2
}
\\
&& {}\xrightarrow{L_1\leftrightarrow L_3}{}
&\systeme{
-x_1 +x_2 +2x_3 = -2,
-x_2 +3x_3 = -2,
2x_1 -x_2 -x_3 = 1
}
\\
&& {}\xrightarrow{L_3\rightarrow L_3 + 2L_1}{}
&\systeme{
-x_1 +x_2 +2x_3 = -2,
-x_2 +3x_3 = -2,
x_2 +3x_3 = -3
}
\end{alignat*}
\end{document}
答案2
这是tabstackengine
表示方程组的另一种方法。但是,由于我们使用空格作为术语分隔符,因此语法很严格,不能随意添加空格。一般来说,要记住以下几点:
如果需要运算符(
+
,,-
=
) 对齐,则它们不能附加到任何一个项上(即必须形成自己的列);如果只需要项的右对齐,而不需要运算符对齐,则运算符可以放在前导项或尾随项旁边只要系统所有方程的语法一致;{}
用作空术语的占位符;为了实现这种语法,前导减号将被视为二元运算,除非以
{-}
;的形式呈现。不允许出现杂散空格,包括前导空格和尾随空格,以及逗号
,
等式分隔符周围的空格。
这是 MWE。
回应芭芭拉的评论,如果我将前导减号分组为 而{-}
不是-
,以防止它们被视为二元运算符,结果如下。此外,为了展示解决方案的灵活性,可以在前导码中设置行间基线跳过,例如,\setstackgap{L}{1.2\normalbaselineskip}
\documentclass{article}
\usepackage{amsmath}
\usepackage{tabstackengine}
\def\typesystem#1#2{\savestack{#1}{\setstackEOL{,}\setstackTAB{ }
$\left\{\ensurestackMath{\tabbedCenterstack[r]{#2}}\right.$}}
\TABbinary
\stackMath
\setstackgap{S}{12pt}
\setstackgap{L}{1.2\normalbaselineskip}
\begin{document}
\typesystem{\systemA}{2x_1 - x_2 - x_3 = 1,4x_1 - 3x_2 + x_3 = 0,{-}x_1 + x_2 + 2x_3 = {-2}}
\typesystem{\systemB}{2x_1 - x_2 - x_3 = 1,{} - x_2 + 3x_3 = {-}2,{-}x_1 + x_2 + 2x_3 = {-2}}
\typesystem{\systemC}{{-}x_1 + x_2 + 2x_3 = {-2},{} - x_2 + 3x_3 = {-}2,2x_1 - x_2 - x_3 = 1}
\typesystem{\systemD}{{-}x_1 +x_2 +2x_3 = {-2},{} -x_2 +3x_3 = {-}2,{} x_2 +3x_3 = {-3}}
\typesystem{\systemE}{{-}x_1 +x_2 +2x_3 = {-2},{} -x_2 +3x_3 = {-}2,{} {} +6x_3 = {-5}}
\systemA\quad
\alignShortunderstack{%
\xrightarrow{L_2\rightarrow L_2 - 2L_1}&\systemB\\
\xrightarrow{L_1\leftrightarrow L_3}&\systemC\\
\xrightarrow{L_3\rightarrow L_3 + 2L_1}&\systemD\\
\xrightarrow{L_3\rightarrow L_3 + L_2}&\systemE
}
\end{document}