请考虑以下示例:
\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\begin{document}
\begin{alignat*}{5}
&\text{Honning:}\qquad
&&\frac{\SI{16710}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{16710} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx{} &\SI{182}{\degree}&;\\
&\text{Pollen:}
&&\frac{\SI{10155}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{10155} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx{} &\SI{111}{\degree}&;\\
&\text{Vand:}
&&\frac{\SI{6210}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{6210 \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx{} &\SI{68}{\degree}&.
\end{alignat*}
\end{document}
{}
如果不添加,是否可以获得相同的对齐方式和间距\approx
?
更新
简化后沃纳的回答更进一步,我想出了以下解决方案:
\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\ExplSyntaxOn
\cs_new_eq:NN \calculate \fp_eval:n
\ExplSyntaxOff
\newcommand*\pieSlice[1]{%
\dfrac{\SI{#1}{\g}}{\SI{\total}{\g}} \cdot \SI{360}{\degree}
& {\mkern -3mu}\biggl(\dfrac{\num{#1} \cdot 360}{\num{\total}}\biggr){\mkern -3mu} \si{\degree}
& \calculate{round(#1*360/\total)} \si{\degree}
&
}
\newcommand*\total{\calculate{\honning+\pollen+\vand}}
\begin{document}
\begin{equation*}
\def\honning{16710}
\def\pollen{10155}
\def\vand{6210}
\renewcommand*\arraystretch{2.2}
\begin{array}{l@{\qquad} l@{{}={}} l@{{}\approx{}} r@{} l}
\text{Honning:} & \pieSlice{\honning}; \\
\text{Pollen:} & \pieSlice{\pollen}; \\
\text{Vand:} & \pieSlice{\vand}.
\end{array}
\end{equation*}
\end{document}
答案1
由于构造是一致的并且不需要编号,因此可以定义一个宏来处理每一行,根据需要构造一个数组:
\documentclass{article}
\usepackage{amsmath,siunitx}
\ExplSyntaxOn
\newcommand{\calculation}[2]{% \calculation{<num>}{<denom>}
\dfrac{\SI{#1}{\g}}{\SI{#2}{\g}} \cdot \SI{360}{\degree}
& \biggl( \dfrac{\num{#1} \cdot 360}{\num{#2}} \biggr) \si{\degree}
& \fp_eval:n {round(#1 * 360 / #2)} \si{\degree}
&
}
\ExplSyntaxOff
\begin{document}
\[
\renewcommand{\arraystretch}{2.1}
\begin{array}{l@{\qquad}l@{{}={}}l@{{}\approx{}}r@{}l}
\text{Honning:} & \calculation{16710}{33075}; \\
\text{Pollen:} & \calculation{10155}{33075}; \\
\text{Vand:} & \calculation{6210}{33075}.
\end{array}
\]
\end{document}
除了列规范(处理间距;可以修改)之外,代码可能更易于阅读。当然,它可以进一步简化。
答案2
如果删除&
以下内容\approx
,则可以通过以下两种方式实现所需的结果:
- 为最后一种情况添加
\phantom{1}
以使其右对齐。 - 定义一个自定义的
MySI
,用于\makebox
确保文本在适当的宽度内右对齐。
代码:\phantom
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\begin{document}
\begin{alignat*}{5}
&\text{Honning:}\qquad
&&\frac{\SI{16710}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{16710} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \SI{182}{\degree}&;\\
&\text{Pollen:}
&&\frac{\SI{10155}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{10155} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \SI{111}{\degree}&;\\
&\text{Vand:}
&&\frac{\SI{6210}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{6210 \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \phantom{1}\SI{68}{\degree}&.
\end{alignat*}
代码:\MySI
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\usepackage{calc}
\newcommand*{\MySI}[2]{\makebox[\widthof{\SI{999}{#2}}][r]{\SI{#1}{#2}}}%
\begin{document}
\begin{alignat*}{5}
&\text{Honning:}\qquad
&&\frac{\SI{16710}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{16710} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \MySI{182}{\degree};\\
&\text{Pollen:}
&&\frac{\SI{10155}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{10155} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \MySI{111}{\degree};\\
&\text{Vand:}
&&\frac{\SI{6210}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{6210 \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx \MySI{68}{\degree}.
\end{alignat*}
\end{document}
答案3
该答案用刚刚发布的包中\alignat
的替换了(可能已经或尚未传播到您附近的 CTAN 镜像)。\alignShortstack
tabstackengine
好消息是:1)不需要approx
;{}
2)结果看起来相同
坏消息是:1)它运行非常慢(我不确定为什么);2)孤独\qquad
需要一个{}
(我不确定为什么)。
已编辑,因为我可以在某些情况下使用它\centering
(通过将 EOL 字符从 更改为\\
,例如\#
)
\documentclass{article}
\usepackage{siunitx}
\usepackage{tabstackengine}
\stackMath
\makeatletter
\newcommand\TABstackDisplay{\renewcommand\TAB@delim[1]{\displaystyle##1}}
\makeatother
\TABstackDisplay
\setstackaligngap{0ex}
\setstackgap{S}{4pt}
\setstackEOL{\#}
\begin{document}
{\centering
\alignShortstack{
&\text{Honning:}\qquad{}
&&\frac{\SI{16710}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{16710} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx &\SI{182}{\degree}&;\#
&\text{Pollen:}
&&\frac{\SI{10155}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{\num{10155} \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx &\SI{111}{\degree}&;\#
&\text{Vand:}
&&\frac{\SI{6210}{\g}}{\SI{33075}{\g}} \cdot \SI{360}{\degree}
&&= {\mkern -6mu}\left(\frac{6210 \cdot 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx &\SI{68}{\degree}&.
}
}
\end{document}
答案4
仅具有 3 个对齐点和一对括号的解决方案one
(作为 alignat* 环境的间距参数 - 第一行):
\documentclass[12pt]{article}
\usepackage{mathtools}
\usepackage{siunitx}
\begin{document}
\begin{alignat*}{3}
& \text{Honning:}\qquad
&\frac{\SI{16710}{\g}}{\SI{33075}{\g}} · \SI{360}{\degree}
&= {\mkern -6mu}\left(\frac{\num{16710} · 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&{}&\approx {} \SI{182}{\degree};\\
& \text{Pollen:}
&\frac{\SI{10155}{\g}}{\SI{33075}{\g}} · \SI{360}{\degree}
&= {\mkern -6mu}\left(\frac{\num{10155} · 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
& & \approx{} \SI{111}{\degree};\\
& \text{Vand:}
& \frac{\SI{6210}{\g}}{\SI{33075}{\g}} · \SI{360}{\degree}
&= {\mkern -6mu}\left(\frac{6210 · 360}{\num{33075}}\right){\mkern -6mu}\,\si{\degree}
&&\approx{} \SI{68}{\degree} .
\end{alignat*}
\end{document}
导致:
如果您希望最后一组单元右对齐,只需\hphantom{0}
在前面添加 \SIunit{68}
: