我已经使用下面的代码片段很长时间来排版文档中的重要公式了。到目前为止,我总是复制粘贴代码片段并手动调整,直到间距看起来令人满意,但这不是我们使用 LaTeX 的原因,对吧?
我希望我的片段自动平衡间距(说起来,下面截图中的三个标记空间应该是相同的大小)。还有某种宏,可以给它一个更好的输入格式减少多余的复制粘贴会很好(例如不必每次都输入\vspace{\baselineskip}
等\begingroup
)。我该如何实现这一点?(我想还有很多可能性可以完善它,所以我当然也愿意接受其他建议。)
\documentclass{article}
\usepackage{multirow}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\vspace{\baselineskip}
\begingroup
\setlength{\tabcolsep}{0pt}
\begin{tabular}{crl}
\multirow{4}{.3\textwidth}{%
\centering
$Re = \dfrac{v\cdot d}{\nu}$
}
&$Re$&\dots Reynolds number $[-]$\\
&$v$&\dots velocity of the fluid $[\si{\milli\meter\per\second}]$\\
&$d$&\dots characteristic linear dimension $[\si{\milli\meter}]$\\
&$\nu$&\dots kinematic viscosity $[\si{\milli\meter\squared\per\second}]$
\end{tabular}
\endgroup
\vspace{\baselineskip}
\lipsum[2]
\end{document}
答案1
编辑添加方程式编号并照顾\si{...}
下面的代码定义了一个命令\ExplainedFormula
,当给出
\ExplainedFormula{\Re = \dfrac{v\cdot d}{\nu}}
{\Re: Reynolds number:,
v: velocity of the fluid: \milli\meter\per\second,
d: characteristic linear dimension: \milli\meter,
\nu: kinematic viscosity: \milli\meter\squared\per\second
}
Nulla malesuada porttitor diam. Donec felis erat, congue non,
volutpat at, tincidunt tristique, libero. Vivamus viverra fermentum
felis. Donec nonummy pellentesque ante.
\ExplainedFormula*{\Re = \dfrac{v\cdot d}{\nu}}
{\Re: Reynolds number:,
v: velocity of the fluid: \milli\meter\per\second,
d: characteristic linear dimension: \milli\meter,
\nu: kinematic viscosity: \milli\meter\squared\per\second
}
将产生如下输出:
默认情况下,\ExplainedFormula
将添加公式编号,还有一个带星号的版本,,\ExplainedFormula*
省略了公式编号。公式编号在左侧,因为我总是把它放在这里:)要把它放在右边,请移动该行,\IfBooleanF{#1}{\refstepcounter{equation}\rlap{(\theequation)}}
使其位于最后一个之后\hfil
,然后将更\ExplainedFormula
改为...也许我应该自动执行此操作...`\rlap
\llap
完整代码如下:
\documentclass{article}
\usepackage{multirow}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{xparse}
\renewcommand\Re{\mathop{\textrm{Re}}}
\def\Explain#1:#2:#3!!!{% \Explain variable : description : unit !!!
$#1$ & #2 $[\if\relax\detokenize{#3}\relax-\else\si{#3}\fi]$
\\
}% add a line of explanation
\NewDocumentCommand\ExplainedFormula{ s m m }{%
% usage: \ExplainedFormula{formula}{csv explanation}
\begin{center}
\hbox to\textwidth{%
\IfBooleanF{#1}{\refstepcounter{equation}\rlap{(\theequation)}}
\hfil$\displaystyle#2$
\hfil\renewcommand*\do[1]{\Explain##1!!!}%
\begin{tabular}{r@{\dots}l}\docsvlist{#3}\end{tabular}
\hfil%
}%
\end{center}
}
\begin{document}
\ExplainedFormula{\Re = \dfrac{v\cdot d}{\nu}}
{\Re: Reynolds number:,
v: velocity of the fluid: \milli\meter\per\second,
d: characteristic linear dimension: \milli\meter,
\nu: kinematic viscosity: \milli\meter\squared\per\second
}
Nulla malesuada porttitor diam. Donec felis erat, congue non,
volutpat at, tincidunt tristique, libero. Vivamus viverra fermentum
felis. Donec nonummy pellentesque ante.
\ExplainedFormula*{\Re = \dfrac{v\cdot d}{\nu}}
{\Re: Reynolds number:,
v: velocity of the fluid: \milli\meter\per\second,
d: characteristic linear dimension: \milli\meter,
\nu: kinematic viscosity: \milli\meter\squared\per\second
}
\end{document}
一些解释:
- 宏
\ExplainedFormula
定义使用\NewDocumentCommand
使用解析包。s m m
规范说\ExplainedFormula
有三个参数,一个可选参数和两个强制参数。如果存在,*
则不打印方程编号。*
- 强制性论据
\ExplainedFormula
是针对公式和逗号分隔列表“解释”。反过来,每个“解释”由一个变量、:
一个解释、另一个解释:
和\si
单位组成,如果没有,则应留空(例如上例中的雷诺数)。解释不应包含,!!!
因为这是用来\Explain
分隔公式和描述部分的。公式的部分不应被包围,$...$
因为它们是由\ExplainedFormula
- 逗号分隔的解释列表使用以下方式处理
\docsvlist
来自电子工具箱包装在一起,并使用一些技巧(通过\Explain
),将公式组件和描述分开。发生的事情是,它\do
获得了逗号分隔的描述的每个部分,例如\Re: Reynolds number:
,它将其赋予末尾添加的,以便\Explain
宏 知道在哪里结束。!!!
\Explain
#3
- 所有东西都放在一个
\hbox
宽度为 的盒子里\textwidth
,盒子的组件之间用 分隔\hfil
,每个组件都会均匀扩展以填满可用空间。这应该会给出所需的等距间距 - 我已经
Re
用替换了\Re
,其结果是\renewcommand\Re{\mathop{\textrm{Re}}}
- 我不太喜欢
\dots
解释中的 。我可能会在两边添加空格,使用类似@{\,\dots\,}
表格定义中的方法,或者改用冒号或等号...
答案2
我完全消除了multirow
和tabular
。我使用\hfill
来实现等间距,使用 TABstack 来表示解释,使用\vcenter
ed\hbox
来表示公式。别忘了\noindent
。
\documentclass{article}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\usepackage{tabstackengine}
\begin{document}
\lipsum[1]
\vspace{\baselineskip}%
\noindent\hfill%
$\vcenter{\hbox{$Re = \dfrac{v\cdot d}{\nu}$}}$%
\hfill%
\alignCenterstack{%
$Re$&\dots Reynolds number $[-]$\\
$v$&\dots velocity of the fluid $[\si{\milli\meter\per\second}]$\\
$d$&\dots characteristic linear dimension $[\si{\milli\meter}]$\\
$\nu$&\dots kinematic viscosity $[\si{\milli\meter\squared\per\second}]$
}%
\hfill%
\vspace{\baselineskip}
\lipsum[2]
\end{document}
易于放置在宏中,如下所示\explainedFormula
:
\documentclass{article}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\usepackage{tabstackengine}
\newcommand\explainedFormula[2]{%
\vspace{\baselineskip}%
\noindent\hfill%
$\vcenter{\hbox{$#1$}}$\hfill%
\alignCenterstack{#2}\hfill%
\vspace{\baselineskip}
}
\begin{document}
\lipsum[1]
\explainedFormula{Re = \dfrac{v\cdot d}{\nu}}
{%
$Re$&\dots Reynolds number $[-]$\\
$v$&\dots velocity of the fluid $[\si{\milli\meter\per\second}]$\\
$d$&\dots characteristic linear dimension $[\si{\milli\meter}]$\\
$\nu$&\dots kinematic viscosity $[\si{\milli\meter\squared\per\second}]$
}%
\lipsum[2]
\end{document}
答案3
简单但不太通用的实现。环境必须包含命令\description
(不作为命令执行)。
\documentclass{article}
\usepackage{multirow}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\usepackage{environ,pbox}
\NewEnviron{MaxD}{%
\expandafter\parseMaxD\BODY\endparseMaxD%
}
\long\def\parseMaxD#1\description#2\endparseMaxD{
\vspace{\baselineskip}%
\hfill%
\pbox{0.45\linewidth}{$#1$}%
\hfill%
\begin{tabular}{@{}r@{\dots}l@{}}%
#2%
\end{tabular}%
\hfill%
\vspace{\baselineskip}}
\begin{document}
\lipsum[1]
\vspace{\baselineskip}
\begingroup
\setlength{\tabcolsep}{0pt}
\begin{tabular}{crl}
\multirow{4}{.3\textwidth}{%
\centering
$Re = \dfrac{v\cdot d}{\nu}$
}
&$Re$&\dots Reynolds number $[-]$\\
&$v$&\dots velocity of the fluid $[\si{\milli\meter\per\second}]$\\
&$d$&\dots characteristic linear dimension $[\si{\milli\meter}]$\\
&$\nu$&\dots kinematic viscosity $[\si{\milli\meter\squared\per\second}]$
\end{tabular}
\endgroup
\vspace{\baselineskip}
\begin{MaxD}
Re = \dfrac{v\cdot d}{\nu}
\description
$Re$& Reynolds number $[-]$\\
$v$& velocity of the fluid $[\si{\milli\meter\per\second}]$\\
$d$& characteristic linear dimension $[\si{\milli\meter}]$\\
$\nu$& kinematic viscosity $[\si{\milli\meter\squared\per\second}]$
\end{MaxD}
\lipsum[2]
\end{document}
为了使其至少更加通用,您可以使用tabularx
包并使用以下内容作为定义\parseMaxD
:
\usepackage{tabularx}
\long\def\parseMaxD#1\description#2\endparseMaxD{
\vspace{\baselineskip}%
\hfill%
\pbox{0.45\linewidth}{$#1$}%
\hfill%
\begin{tabularx}{0.5\linewidth}{@{}r@{\dots}X@{}}%
#2%
\end{tabularx}%
\hfill%
\vspace{\baselineskip}}
\displaystyle
您也可以始终使用来排版公式\pbox{0.45\linewidth}{$\displaystyle #1$}
。
答案4
这很简单;但请注意\Ren
雷诺数(Re
在数学模式下使用会在字母之间添加不必要的空间)。
\documentclass{article}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{lipsum}
\newcommand{\Ren}{\mathit{Re}}
\begin{document}
\lipsum*[1]
\begin{equation}
\Ren = \frac{vd}{\nu}
\qquad
\begin{aligned}
\Ren &\dots\text{Reynolds number (--)}\\
v &\dots\text{velocity of the fluid (\si{\milli\meter\per\second})}\\
d &\dots\text{characteristic linear dimension (\si{\milli\meter})}\\
\nu &\dots\text{kinematic viscosity (\si{\milli\meter\squared\per\second})}
\end{aligned}
\end{equation}
\lipsum[2]
\end{document}
或者,减少垂直间距并可能更容易输入:
\documentclass{article}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{array}
\usepackage{lipsum}
\newcommand{\Ren}{\mathit{Re}}
\begin{document}
\lipsum*[1]
\begin{equation}
\Ren = \frac{vd}{\nu}
\qquad
\begin{tabular}{@{}>{$}r<{$}@{$\dots$}l@{}}
\Ren & Reynolds number (--)\\
v & velocity of the fluid (\si{\milli\meter\per\second})\\
d & characteristic linear dimension (\si{\milli\meter})\\
\nu & kinematic viscosity (\si{\milli\meter\squared\per\second})
\end{tabular}
\end{equation}
\lipsum[2]
\end{document}
如果您更喜欢单一环境:
\documentclass{article}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{array}
\usepackage{lipsum}
\newcommand{\Ren}{\mathit{Re}}
\newenvironment{formulaexplained}
{\qquad\begin{tabular}{@{}>{$}r<{$}@{$\dots$}l@{}}}
{\end{tabular}}
\newenvironment{explainformula}[1]
{\begin{equation}#1\begin{formulaexplained}}
{\end{formulaexplained}\end{equation}}
\newenvironment{explainformula*}[1]
{\begin{equation*}#1\begin{formulaexplained}}
{\end{formulaexplained}\end{equation*}}
\begin{document}
\lipsum*[3]
\begin{explainformula}{
\Ren = \frac{vd}{\nu}
}
\Ren & Reynolds number (--)\\
v & velocity of the fluid (\si{\milli\meter\per\second})\\
d & characteristic linear dimension (\si{\milli\meter})\\
\nu & kinematic viscosity (\si{\milli\meter\squared\per\second})
\end{explainformula}
\lipsum*[3]
\begin{explainformula*}{
\Ren = \frac{vd}{\nu}
}
\Ren & Reynolds number (--)\\
v & velocity of the fluid (\si{\milli\meter\per\second})\\
d & characteristic linear dimension (\si{\milli\meter})\\
\nu & kinematic viscosity (\si{\milli\meter\squared\per\second})
\end{explainformula*}
\lipsum[3]
\end{document}