Optidef 约束名称未正确对齐

Optidef 约束名称未正确对齐

我尝试遵循 optidef.tex 来使约束名称对齐。以下是代码:

\begin{mini*}|s|
    {\substack{\mathbf{x},\mathbf{u}}}{J = \phi\left(\mathbf{x}\left(t_f\right),t_f\right) + \int_{t_0}^{t_f}\mathcal{L}\left(\mathbf{x},\mathbf{u},t\right)dt}{}{}
            \addConstraint{\dot{\mathbf{x}} =}{\mathbf{f}\left(\mathbf{x},\mathbf{u},t\right)}
            \addConstraint{\mathbf{x}\left(0\right)}{= \mathbf{x}_0,}{\quad\text{(Initial condition)}}
            \addConstraint{\Psi\left(\mathbf{x}_f,t_f\right) }{= 0,} {\quad\text{(Terminal constraints)}}
    \end{mini*}

以下是圈出的相应输出: 在此处输入图片描述

有人能解释一下发生了什么吗?我正在 TeXpad 上写这篇文章。

答案1

我很乐意删除此帖子。根据我的发现,你只需要移动登录的=位置

\addConstraint{\dot{\mathbf{x}} =}{\mathbf{f}\left(\mathbf{x},\mathbf{u},t\right)}

成为

\addConstraint{\dot{\mathbf{x}}}{ =\mathbf{f}\left(\mathbf{x},\mathbf{u},t\right)}

完整示例:

\documentclass{article}
\usepackage{optidef}
\begin{document}
\begin{mini*}|s|
    {\substack{\mathbf{x},\mathbf{u}}}{J = \phi\left(\mathbf{x}\left(t_f\right),t_f\right) + \int_{t_0}^{t_f}\mathcal{L}\left(\mathbf{x},\mathbf{u},t\right)dt}{}{}
            \addConstraint{\dot{\mathbf{x}} }{=\mathbf{f}\left(\mathbf{x},\mathbf{u},t\right)}
            \addConstraint{\mathbf{x}\left(0\right)}{= \mathbf{x}_0,}{\quad\text{(Initial condition)}}
            \addConstraint{\Psi\left(\mathbf{x}_f,t_f\right) }{= 0,} {\quad\text{(Terminal constraints)}}
\end{mini*}
\end{document}

在此处输入图片描述

有很多事情可以改进,例如\substack或差异d​​。

答案2

仅供参考,这里有一个解决方案不是使用该optidef包。相反,它使用 1 个align*环境(用于 4 个“外部”块)和 1 个aligned环境(用于 3 个“内部”块组,它们一起构成最终的“外部”块)。 align*并且aligned都由amsmath包提供。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath,amssymb,bm}
\newcommand{\diff}{\mathop{}\!\mathrm{d}} % see https://tex.stackexchange.com/a/385862/5001
\newcommand\tf{t\mkern-1.5mu_f} % snug up the subscript-f to the t

\begin{document}
\begin{align*}
&\text{PM: } \textstyle 
  J=\phi(\mathbf{x}(\tf),\tf)
  +\int_{t_0}^{\tf}\!\mathcal{L}(\mathbf{x},\mathbf{u},t)\diff t \\
&\text{General Problem: } \textstyle 
  \min J=\phi(\mathbf{x}(\tf))
  +\int_{t_0}^{\tf}\! \mathcal{L}(\mathbf{x},\mathbf{u},t)\diff t\\
&{\min_{\mathbf{x},\mathbf{u}}} \quad
  J=\phi(\mathbf{x}(\tf),\tf)
  +\int_{t_0}^{\tf} \!\! \mathcal{L}(\mathbf{x}, \mathbf{u},t)\diff t \\
&\text{s.t.} \quad
  \begin{aligned}[t]
  \dot{\mathbf{x}} &= \mathbf{f}(\mathbf{x},\mathbf{u},t) \\
  \mathbf{x}(0) &= x_0 \qquad\text{(Initial condition)}\\
  \bm{\Psi}(\mathbf{x}_f,\tf) &= 0_{\phantom{0}} \qquad{\text{(Terminal constraint)}}
  \end{aligned}
\end{align*}

\end{document} 

答案3

我无法重现您通过代码获得的输出。

除了将=第二个参数移动\AddConstraint另一个答案,我建议采用不同的设置,将约束左对齐,这对我来说似乎更好。

此外,我还删除了所有\left/\right对,它们除了增加不必要的空格外没有任何作用。相反,必须使用\,before dt。是否要使用直立的“d”取决于你的选择:符合您所在领域的用法(或您的个人喜好)。

\documentclass{article}
\usepackage{amsmath,optidef}

\begin{document}

\subsection*{Original}

\begin{mini*}|s|
    {\substack{\mathbf{x},\mathbf{u}}}{J = \phi\left(\mathbf{x}\left(t_f\right),t_f\right) + \int_{t_0}^{t_f}\mathcal{L}\left(\mathbf{x},\mathbf{u},t\right)dt}{}{}
            \addConstraint{\dot{\mathbf{x}} =}{\mathbf{f}\left(\mathbf{x},\mathbf{u},t\right)}
            \addConstraint{\mathbf{x}\left(0\right)}{= \mathbf{x}_0,}{\quad\text{(Initial condition)}}
            \addConstraint{\Psi\left(\mathbf{x}_f,t_f\right) }{= 0,} {\quad\text{(Terminal constraints)}}
    \end{mini*}

\subsection*{Left alignment}

\begin{mini*}|s|
  {\scriptstyle\mathbf{x},\mathbf{u}}
  {J = \phi(\mathbf{x}(t_f),t_f) + \int_{t_0}^{t_f}\mathcal{L}(\mathbf{x},\mathbf{u},t)\,dt}{}{}
\addConstraint{}{\dot{\mathbf{x}}=\mathbf{f}(\mathbf{x},\mathbf{u},t)}{}
\addConstraint{}{\mathbf{x}(0)= \mathbf{x}_0,}{\quad\text{(Initial condition)}}
\addConstraint{}{\Psi(\mathbf{x}_f,t_f)= 0,}{\quad\text{(Terminal constraints)}}
\end{mini*}

\subsection*{Alignment at equals signs}

\begin{mini*}|s|
  {\scriptstyle\mathbf{x},\mathbf{u}}
  {J = \phi(\mathbf{x}(t_f),t_f) + \int_{t_0}^{t_f}\mathcal{L}(\mathbf{x},\mathbf{u},t)\,dt}{}{}
\addConstraint{\dot{\mathbf{x}}}{=\mathbf{f}(\mathbf{x},\mathbf{u},t)}{}
\addConstraint{\mathbf{x}(0)}{= \mathbf{x}_0,}{\quad\text{(Initial condition)}}
\addConstraint{\Psi(\mathbf{x}_f,t_f)}{= 0,}{\quad\text{(Terminal constraints)}}
\end{mini*}

\end{document}

在我看来,optidef 应该可以选择将下标变量设置为脚本大小而不是正常大小。我选择了更简单的\scriptstyle声明来代替更复杂的声明\substack

在此处输入图片描述

为了进一步简化输入公式的过程,我建议添加类似

\newcommand{\vectorvariable}[1]{\mathbf{#1}}
\newcommand{\vf}{\vectorvariable{f}}
\newcommand{\vu}{\vectorvariable{u}}
\newcommand{\vx}{\vectorvariable{x}}

因此,例如,第一个约束将变成

\addConstraint{}{\dot{\vx}}=\vf(\vx,\vu,t)}{}

如果审阅者告诉你向量变量应该用粗体斜体表示,你只需要添加

\usepackage{bm}

并更改代码中的一行,即

\newcommand{\vectorvariable}[1]{\bm{#1}}

此后,在文档上运行 LaTeX 将产生

在此处输入图片描述

(当然,这取决于你的喜好,可以选择其他布局)。同样,添加

\newcommand{\diff}{\mathop{}\!d}

并在需要微分时键入\diff t,这样您只需更改一行代码即可应对要求直立“d”的挑剔的审阅者或主管。请注意,如果您这样做,\,积分中微分前面的 应该被删除。

相关内容