所有文档的垂直对齐

所有文档的垂直对齐

我正在处理文本,这是我的数学包的规范。规范的典型样式如下:

我只能在单个环境中使用alignarray等对齐表达式。但我希望,所呈现图像中的所有示例都将根据\to符号对齐通过所有文件。有啥办法吗?

所呈现图像的代码(抱歉,它相当复杂):

\documentclass[a4paper,titlepage,11pt,oneside]{book}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{latexsym}
\usepackage{array}
\usepackage{xargs}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{empheq}
\usepackage{courier}

\newcommand{\mkey}[1]{{\mbox{\small\ttfamily #1}}}
\newcommand{\mobj}[2]{\mbox{\ttfamily\small #1}\left [\,#2\,\right]}


\definecolor{boxcolor}{rgb}{.95, .95, 1}

\newsavebox{\mysaveboxM} % M for math
\newcommand*\MetaBox[2][Example]{%
 \sbox{\mysaveboxM}{#2}%
 \sbox{\mysaveboxM}{%
  \parbox[b][\ht\mysaveboxM][b]{%
  \wd\mysaveboxM}{#2}%
 }%
 \sbox{\mysaveboxM}{%
 \fcolorbox{black}{boxcolor}{%
  \makebox[\linewidth-4em]{\usebox{\mysaveboxM}}%
  }%
 }%
 \usebox{\mysaveboxM}%
}

\NewDocumentEnvironment{meta}{O{equation*}O{}}{%
 \setkeys{EmphEqEnv}{#1}%
 \setkeys{EmphEqOpt}{box=\MetaBox,#2}%
 \EmphEqMainEnv}%
 {\endEmphEqMainEnv}


\begin{document}
\subsection{Product}
....
\subsubsection{Indices}
\begin{meta}
\begin{array}{rcl}
\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.indices}&\to&
\mobj{UnorderedIndices}{{}^{kj}{}_{jk}{}^{\mu}{}_{qa}}
\end{array}
\end{meta}
The interesting point introduced here is a special type of product
indices. We will discuss it in section. The general idea here is that  
 from the mathematical point of view the order of resulting product indices          
is undefined.
\subsubsection{List access operations}
\begin{meta}
\begin{array}{rcl}
\mobj{}{V_{\alpha\beta}M_\sigma
Ric^{\kappa\delta}\,\delta^\alpha{}_{\kappa}}\mkey{.size()}&\to&4\\[12pt]
\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.elements}&\to&
\mobj{List}{H^{kj},\,M_j,\,Q_k{}^{\mu}{}_{qa}}
\end{array}
\end{meta}
One of the important (and really hard) decisions we've made is to
consider only commutative theories. So, while processing products, the order   
of elements is not taken into account! However, there are some tricks to       
work with non-commutative theories.\newline Indeed, you can take an element 
by index:
\begin{meta}
\begin{array}{rcl}
\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.get(2)}&\to&
\mobj{SimpleTensor}{Q_k{}^\mu{}_{qa}}
\end{array}
\end{meta}

\end{document} 

答案1

另一种方法是使用\makebox[<size>][l|r|c]{<text>}将左侧和右侧都设置到一个大小完全相同的框中,并将箭头放在\to中间。这里我假设您希望左侧的right 对齐,右侧的left 对齐:

在此处输入图片描述

笔记:

  • 根据评论中的要求,您可以调整\MetaHShift控制线条向右移动的程度。因此,此处的负值将向左移动。此处的零值将导致箭头\to位于中心。

  • array应该要求使用 。但empheq现在允许我像第二个示例一样添加新行,因此array仅将结构用于此目的。可能有一种方法可以添加新行,而无需使用array。另请注意,array选项用于@{}消除左右两侧的列间距。

  • 在我看来,ensuremath在中使用\makebox可以提高可读性,但$...$也可以使用。

代码:

\documentclass[a4paper,titlepage,11pt,oneside]{book}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{latexsym}
\usepackage{array}
\usepackage{xargs}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{empheq}
\usepackage{courier}

\newcommand{\mkey}[1]{{\mbox{\small\ttfamily #1}}}
\newcommand{\mobj}[2]{\mbox{\ttfamily\small #1}\left [\,#2\,\right]}


\definecolor{boxcolor}{rgb}{.95, .95, 1}

\newsavebox{\mysaveboxM} % M for math
\newcommand*\MetaBox[2][Example]{%
 \sbox{\mysaveboxM}{#2}%
 \sbox{\mysaveboxM}{%
  \parbox[b][\ht\mysaveboxM][b]{%
  \wd\mysaveboxM}{#2}%
 }%
 \sbox{\mysaveboxM}{%
 \fcolorbox{black}{boxcolor}{%
  \makebox[\linewidth-4em]{\usebox{\mysaveboxM}}%
  }%
 }%
 \usebox{\mysaveboxM}%
}

\NewDocumentEnvironment{meta}{O{equation*}O{}}{%
    \setkeys{EmphEqEnv}{#1}%
    \setkeys{EmphEqOpt}{box=\MetaBox,#2}%
    \EmphEqMainEnv%
}{%
    \endEmphEqMainEnv%
}

%%
\newcommand*{\MetaHShift}{-0.5em}
\newlength{\widthOfArrow}%
\newlength{\widthOfLeftText}%
\newlength{\widthOfRightText}%
\settowidth{\widthOfArrow}{${}\to{}$}%
\newcommand*{\CentredArrow}[2]{%
    \setlength{\widthOfLeftText}{\dimexpr0.5\linewidth-0.5\widthOfArrow+\MetaHShift\relax}%
    \setlength{\widthOfRightText}{\dimexpr0.5\linewidth-0.5\widthOfArrow-\MetaHShift\relax}%
    \makebox[\widthOfLeftText][r]{\ensuremath{#1}}%
    \ensuremath{{}\to{}}%
    \makebox[\widthOfRightText][l]{\ensuremath{#1}}%
}%

\begin{document}
\subsection{Product}
....
\subsubsection{Indices}
\begin{meta}
\begin{array}{@{}l@{}}
\CentredArrow{\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.indices}}
{\mobj{UnorderedIndices}{{}^{kj}{}_{jk}{}^{\mu}{}_{qa}}}
\end{array}
\end{meta}
The interesting point introduced here is a special type of product
indices. We will discuss it in section. The general idea here is that  
 from the mathematical point of view the order of resulting product indices          
is undefined.
\subsubsection{List access operations}
\begin{meta}
\begin{array}{@{}l@{}}
\CentredArrow{\mobj{}{V_{\alpha\beta}M_\sigma
Ric^{\kappa\delta}\,\delta^\alpha{}_{\kappa}}\mkey{.size()}}{4}
\\[12pt]
\CentredArrow{\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.elements}}{
\mobj{List}{H^{kj},\,M_j,\,Q_k{}^{\mu}{}_{qa}}}
\end{array}
\end{meta}
One of the important (and really hard) decisions we've made is to
consider only commutative theories. So, while processing products, the order   
of elements is not taken into account! However, there are some tricks to       
work with non-commutative theories.\newline Indeed, you can take an element 
by index:
\begin{meta}
\begin{array}{@{}l@{}}
\CentredArrow{\mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.get(2)}}{
\mobj{SimpleTensor}{Q_k{}^\mu{}_{qa}}}
\end{array}
\end{meta}
\end{document} 

答案2

此解决方案使用 TikZ 找到符号的位置,然后从边界框中切除符号的左侧部分。然后,指定将\symbolOffset符号从左边距移动多远。偏移量将是整个文档的(前提是\symbolOffset未在某处设置为新值)。由于环境meta会自动将其内容居中,因此数组被包裹以minipage再次获得左对齐(否则偏移量不起作用)。文件必须需要编译两次才能正常工作。

这个解决方案的缺点是您必须手动调整偏移量,以免任何部分溢出。

我已将我的解决方案纳入您的示例中:

\documentclass[a4paper,titlepage,11pt,oneside]{book}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{latexsym}
\usepackage{array}
\usepackage{xargs}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{empheq}
\usepackage{courier}

\newcommand{\mkey}[1]{{\mbox{\small\ttfamily #1}}}
\newcommand{\mobj}[2]{\mbox{\ttfamily\small #1}\left [\,#2\,\right]}

\definecolor{boxcolor}{rgb}{.95, .95, 1}

\newsavebox{\mysaveboxM} % M for math
\newcommand*\MetaBox[2][Example]{%
 \sbox{\mysaveboxM}{#2}%
 \sbox{\mysaveboxM}{%
  \parbox[b][\ht\mysaveboxM][b]{%
  \wd\mysaveboxM}{#2}%
 }%
 \sbox{\mysaveboxM}{%
 \fcolorbox{black}{boxcolor}{%
  \makebox[\linewidth-4em]{\usebox{\mysaveboxM}}%
  }%
 }%
 \usebox{\mysaveboxM}%
}

\NewDocumentEnvironment{meta}{O{equation*}O{}}{%
 \setkeys{EmphEqEnv}{#1}%
 \setkeys{EmphEqOpt}{box=\MetaBox,#2}%
 \EmphEqMainEnv}%
 {\endEmphEqMainEnv}



% --- NEW STUFF --------------------
\usepackage{tikz}
\usetikzlibrary{calc}

\newlength{\symbolOffset}
\setlength{\symbolOffset}{6.2cm} % Distance between the left margin and the
                                 % symbol
\newcommand{\thesymbol}{$\to$} % Symbol
\newcommand{\alignSymbol}{%
  \begin{tikzpicture}%
    \node [inner sep=0pt] (symbol) {\thesymbol};
  \end{tikzpicture}%
}

\newcommand{\alignArray}[1]{%
  \begin{minipage}{\textwidth}%
    \hspace*{\symbolOffset}%
    \begin{tikzpicture}[remember picture]%
      \node (array) [inner sep=0pt] {${#1}$};
      \pgfresetboundingbox
      \path [use as bounding box]
        (symbol |- array.north) rectangle (array.south east);
    \end{tikzpicture}%
  \end{minipage}%
}
% --- END NEW STUFF ----------------



\begin{document}
\subsection{Product}
....
\subsubsection{Indices}
\begin{meta}
  \alignArray{
    \begin{array}{rcl}
      \mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.indices}&\alignSymbol&
      \mobj{UnorderedIndices}{{}^{kj}{}_{jk}{}^{\mu}{}_{qa}}
    \end{array}
  }
\end{meta}
The interesting point introduced here is a special type of product indices. We
will discuss it in section. The general idea here is that from the mathematical
point of view the order of resulting product indices is undefined.
\subsubsection{List access operations}
\begin{meta}
  \alignArray{
    \begin{array}{rcl}
      \mobj{}{V_{\alpha\beta}M_\sigma
        Ric^{\kappa\delta}\,\delta^\alpha{}_{\kappa}}\mkey{.size()}&\alignSymbol&4\\[12pt]
      \mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.elements}&\alignSymbol&
      \mobj{List}{H^{kj},\,M_j,\,Q_k{}^{\mu}{}_{qa}}
    \end{array}
  }
\end{meta}
One of the important (and really hard) decisions we've made is to consider only
commutative theories. So, while processing products, the order of elements is
not taken into account! However, there are some tricks to work with
non-commutative theories.\newline Indeed, you can take an element by index:
\begin{meta}
  \alignArray{
    \begin{array}{rcl}
      \mobj{}{H^{kj}M_jQ_k{}^{\mu}{}_{qa}}\mkey{.get(2)}&\alignSymbol&
      \mobj{SimpleTensor}{Q_k{}^\mu{}_{qa}}
    \end{array}
  }
\end{meta}

\end{document} 

在此处输入图片描述

相关内容