我正在尝试显示一个包含两列的表格。第一列显示一个标识符,第二列显示该标识符的方程式。表格看起来会像这样(如果表格中允许使用方程式,但这不是主要问题)。
\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>
可以指定附加项(l
eft、r
ight 和c
enter)。
\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}
wherepredef
和postdef
are 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}