对齐环境中的表格类选项

对齐环境中的表格类选项

我正在尝试显示一个包含两列的表格。第一列显示一个标识符,第二列显示该标识符的方程式。表格看起来会像这样(如果表格中允许使用方程式,但这不是主要问题)。

\begin{tabular}{|c|c|}
\hline
Clause & Input\\
\hline
Clause \ref{one} & \begin{equation} part1 \rightarrow (part2 \rightarrow part3)\end{equation}\\
Clause \ref{two} & \begin{equation} part1' \rightarrow (part2' \rightarrow part3')\end{equation}\\
\hline
\end{tabular}

问题是,part1 与 part1' 相似,part2 与 part2' 相似,... 而我希望方程的这些子部分能够对齐。也就是说,更接近于这样:

\begin{align}
\cline{1-4}
\text{Clause} & Input & & \\
\cline{1-4}
\text{Clause \ref{one}} & part1 & \rightarrow (part2 & \rightarrow part3)\\
\text{Clause \ref{two}} & part1' & \rightarrow (part2' & \rightarrow part3')\\
\cline{1-4}
\end{align}

但是使用此选项,很难重现表格{|c|c|} 格式......

有没有办法正确地做到这一点?或者结合这些环境?注意:我真的想避免设置任何特定的尺寸(迷你页面,...)


[编辑]:我找到了一个可行的解决方案。可能还有更好的解决方案,但这里是完整代码:

在此处输入图片描述

\newcolumntype{E}{>{\refstepcounter{equation}(\theequation)}c}


\begin{tabular}{|c|lllE|}
\hline 
Clause & \multicolumn{4}{|c|}{$ctx$} \\
\hline
Clause \ref{clause:sas15:read} &
$v' = a[i]$ & $ \rightarrow ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v')$ & $ \rightarrow P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#}))$ & \label{eq:call:insts:read} \\
Clause \ref{clause:sas15:write} & $ a' = a[i \leftarrow v]$ & $ \rightarrow ((v_a' = a'[k_a'] \wedge i^{\#} =  i \wedge v^{\#} =  v)$ & $  \rightarrow P_2^{\#}((k_a', v_a'), i^{\#}, v^{\#})) $ & \label{eq:call:insts:write}\\
Clause \ref{clause:sas15:noarray} & $v' = 0$ & $ \rightarrow ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v )$ & $   \rightarrow P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#}))$ & \label{eq:call:insts:noarray}\\
\hline
\end{tabular}

我会将这个帖子保留一天,以防有人有更好的解决方案。

答案1

这是一个在单一tabular环境下运行的解决方案,其中精心构建了一种新的数学模式列类型,L并在方程式数字左侧留有一点额外的空间。

在此处输入图片描述

\documentclass{article} % or some other suitable document class
\usepackage[letterpaper,margin=1in]{geometry} % set page parameters as needed

\usepackage{amsmath}
\usepackage{array} % for '\newcolumntype' macro
\newcolumntype{L}{>{$\displaystyle{}}l<{$}} % automatic display-style math mode
\newcolumntype{E}{>{\refstepcounter{equation}(\theequation)}r@{\hspace{2pt}}}

\begin{document}

\begin{center}
\renewcommand\arraystretch{1.5}
\begin{tabular}{| l | L@{}L@{}L @{\qquad} E |}
\hline 
Clause & \multicolumn{3}{c}{ctx} & \multicolumn{1}{c|}{} \\
\hline
\ref{clause:sas15:read} 
  & v' = a[i]  
  & \to ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v') 
  & \to P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#})) 
  & \label{eq:call:insts:read} \\
\ref{clause:sas15:write} 
  & a' = a[i \leftarrow v] 
  & \to ((v_a' = a'[k_a'] \wedge i^{\#} =  i \wedge v^{\#} =  v) 
  & \to P_2^{\#}((k_a', v_a'), i^{\#}, v^{\#}))  
  & \label{eq:call:insts:write}\\
\ref{clause:sas15:noarray} 
  & v' = 0 
  & \to ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v ) 
  & \to P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#})) 
  & \label{eq:call:insts:noarray} \\
\hline
\end{tabular}
\end{center}

\end{document}

答案2

考虑使用方框来查找方程中最宽的元素。此方法简化为eqparbox。下面我使用\eqmathbox[<tag>][<align>]{<stuff>}将所有具有相同内容<tag>的框设置为与最宽匹配的宽度<stuff><align>可以指定附加项(left、right 和center)。

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath,eqparbox}
\usepackage{array,booktabs}

\newcolumntype{E}{>{\refstepcounter{equation}(\theequation)}c}

% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
  \IfValueTF{#1}
    {\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}}
    {\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}}
  \mathpalette\eqmathbox@{#3}
}
\makeatother

\begin{document}

\begin{center}
  \begin{tabular}{ c l E }
    \toprule 
    Clause & \multicolumn{2}{c}{$ctx$} \\
    \midrule
    Clause 1 &
      $\eqmathbox[c1][l]{v' = a[i]} \rightarrow 
        \eqmathbox[c2][l]{\bigl( (v_a' = a[k_a'] \wedge i^{\#} = i \wedge v'^{\#} = v')} \rightarrow 
        \eqmathbox[c3][l]{P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#}) \bigr)}$ & \label{eq:call:insts:read} \\
    Clause 2 & 
      $\eqmathbox[c1][l]{a' = a[i \leftarrow v]} \rightarrow 
        \eqmathbox[c2][l]{\bigl( (v_a' = a'[k_a'] \wedge i^{\#} = i \wedge v^{\#} = v)} \rightarrow 
        \eqmathbox[c3][l]{P_2^{\#}((k_a', v_a'), i^{\#}, v^{\#}) \bigr)}$ & \label{eq:call:insts:write} \\
    Clause 3 & 
      $\eqmathbox[c1][l]{v' = 0} \rightarrow 
        \eqmathbox[c2][l]{\bigl( (v_a' = a[k_a'] \wedge i^{\#} = i \wedge v'^{\#} = v)} \rightarrow 
        \eqmathbox[c3][l]{P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#}) \bigr)}$ & \label{eq:call:insts:noarray} \\
    \bottomrule
  \end{tabular}
\end{center}

\end{document}

答案3

你也可以使用IEEEeqnarraybox来自IEEEtrantools包。在代码中

  • t用于居中的“文本”列(s分别u用于左对齐和右对齐文本),l用于左对齐的“数学”列(c分别r用于居中和右对齐数学),并且?&/用于列分隔。
  • IEEEeqnarrayrulerow相当于hline带有一个可选参数来指定规则的厚度,而IEEEeqnarraymulticol相当于multicolumn
  • IEEEeqnarraydefcol有点类似于newcolumntype。语法是\IEEEeqnarraydefcol{col_id}{predef}{postdef}wherepredefpostdefare like >{\command}and <{\command}

(方程代码取自Mico 的回答

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath}
\usepackage{IEEEtrantools}

\IEEEeqnarraydefcol{e}{\refstepcounter{equation}(\theequation)}{}

\begin{document}
\begin{table}[htbp]
    \footnotesize
    \centering
    \begin{IEEEeqnarraybox}[\IEEEeqnarraystrutmode\IEEEeqnarraystrutsizeadd{2pt}{1pt}]{t?l/l/l/e}
        \IEEEeqnarrayrulerow[0.8pt]\\
        Clause & \IEEEeqnarraymulticol{4}{c}{ctx}\\
        \IEEEeqnarrayrulerow[0.5pt]\\
        Clause 1 
        & v' = a[i]  
        & \to ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v') 
        & \to P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#})) 
        & \label{eq:call:insts:read} \\
        Clause 2
        & a' = a[i \leftarrow v] 
        & \to ((v_a' = a'[k_a'] \wedge i^{\#} =  i \wedge v^{\#} =  v) 
        & \to P_2^{\#}((k_a', v_a'), i^{\#}, v^{\#}))  
        & \label{eq:call:insts:write}\\
        Clause 3 
        & v' = 0 
        & \to ((v_a' = a[k_a'] \wedge i^{\#} =  i \wedge v'^{\#} =  v ) 
        & \to P_2^{\#}((k_a', v_a'), i^{\#}, v'^{\#})) 
        & \label{eq:call:insts:noarray} \\
        \IEEEeqnarrayrulerow[0.8pt]%
    \end{IEEEeqnarraybox}
\end{table}
\end{document}

相关内容