对于排版带有实验设计的表格,我必须在表格的某一列中排版诸如“+ - + +”、“- - - +”等字符串来表示所谓的实验运行模式(有时它们还包含“a”、“A”和“0”(零))。
但是,所用字体(KOMA 脚本类 scrreprt 中的标准字体)中“+”和“-”符号的宽度差别很大,并且 2 个或 3 个破折号的序列会形成一个长破折号或非常长的破折号......
因此,我正在寻找一种方法来轻松排版,例如“+ - - - + -”,字符之间留有一点间距,并且(如果可能的话)由相同数量的字符组成的几个不同的字符串(“+”或“ - ”,“a”,“A”和“0”)将彼此对齐,当它们位于表格的同一列时。
我希望我能清楚地说明我需要什么,这里有一些它不应该出现的例子:
第 9 行应该是“+ - -”,第 10 行应该是“- - +”,第 5 行应该是“- - -”
\,
如果我在字符之间插入,它看起来会好一些,但由于宽度不同,它仍然没有对齐:
当然,我可以将其拆分成居中的列- & + & - & - & ...
,但是表格已经足够复杂了,我不想添加 3 到 7 列......
有人知道如何解决这个问题吗?也许可以使用像 --+--++ 这样的命令来解析字符串,并使用“固定间距”对其进行排版?
- - - - 编辑:
增加了“+”和“-”的数学模式,现在看起来更好了,但并不完美:
\documentclass[11pt, a4paper%, halfparskip
]{scrreprt}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{cccccccc}
\midrule
1 & $+$$+$$-$ \\
2 & $+$$-$$+$ \\
3 & $-$$+$$+$ \\
4 & 000 \\
5 & $-$$-$$-$ \\
6 & 000 \\
\midrule
7 & $-$$+$$-$ \\
8 & 000 \\
9 & $+$$-$$-$ \\
10 & $-$$-$$+$ \\
11 & $+$$+$$+$ \\
12 & 000 \\
\midrule
13 & 000 \\
14 & 00a \\
15 & 00A \\
16 & 0A0 \\
17 & A00 \\
18 & 0a0 \\
19 & a00 \\
20 & 000 \\
\toprule
\end{tabular}
\end{document}
有关副作用的示例和进一步的问题:
我使用了 Michel 的解决方案,看起来不错,但有一件事我不确定:它是否有可能改变列之间的自由空间?我的印象是前 3 列比其余列更接近……我该如何解决这个问题?
答案1
\documentclass{minimal}
\begin{document}
\setlength{\parindent}{0pt}
\newlength{\stretchlen}\setlength{\stretchlen}{1em}
\def\splitterm{\_}
\newcommand{\stretchit}[1]{\leavevmode\realstretch#1\_}
\def\realstretch#1{%
\def\temp{#1}%
\ifx\temp\splitterm
\else
\hbox to \stretchlen{\hss#1\hss}\expandafter\realstretch
\fi}
\stretchit{abcd}\par
\stretchit{----}\par
\stretchit{++++}\par
\stretchit{-+-+}\par
\stretchit{0aA+}\par
\end{document}
\stretchit
在其参数后附加下划线并将其传递给\realstretch
,后者以递归方式一次“吃掉”一个字母,并将其排版为 居中并\hbox
拉伸到\stretchlen
。因此,所有字母的宽度都相等,并且由于它们居中,因此可以很好地对齐。
---问题的解决方案:
\documentclass[10pt, a4paper ]{scrreprt}
\usepackage{booktabs}
\usepackage{collcell}
\usepackage{array}
\begin{document}
\setlength{\parindent}{0pt}
\newlength{\stretchlen}\setlength{\stretchlen}{1em}
\def\splitterm{\_}
\newcommand{\stretchit}[1]{\leavevmode\realstretch#1\_}
\def\realstretch#1{%
\def\temp{#1}%
\ifx\temp\splitterm
\else
\hbox to \stretchlen{\hss#1\hss}\expandafter\realstretch
\fi}
without the stretchit command
\begin{tabular}{cccccccc}
\midrule
1 & ++- \\
2 & +-+ \\
3 & -++ \\
4 & 000 \\
5 & --- \\
6 & 000 \\
\midrule
7 & -+- \\
8 & 000 \\
9 & +-- \\
10 & --+ \\
11 & +++ \\
12 & 000 \\
\midrule
13 & 000 \\
14 & 00a \\
15 & 00A \\
16 & 0A0 \\
17 & A00 \\
18 & 0a0 \\
19 & a00 \\
20 & 000 \\
\toprule
\end{tabular}
\medskip
\emph{with} the stretchit command
\begin{tabular}{c>{\collectcell\stretchit}c<{\endcollectcell}ccccccc}
\midrule
1 & ++- \\
2 & +-+ \\
3 & -++ \\
4 & 000 \\
5 & --- \\
6 & 000 \\
\midrule
7 & -+- \\
8 & 000 \\
9 & +-- \\
10 & --+ \\
11 & +++ \\
12 & 000 \\
\midrule
13 & 000 \\
14 & 00a \\
15 & 00A \\
16 & 0A0 \\
17 & A00 \\
18 & 0a0 \\
19 & a00 \\
20 & 000 \\
\toprule
\end{tabular}
\end{document}
答案2
确保你排版了它们数学模式,即$-$
和$+$
。
请注意,如果您使用单一数学模式或为它们使用单独的数学模式,情况会有所不同。在第一种情况下,最后一个符号的间距不同,因为它被视为一元符号,而其他符号是运算符。
比较以下内容:
\documentclass{article}
\begin{document}
$-$$-$$-$$+$$+$$+$
$+$$+$$+$$+$$+$$+$
$-$$-$$-$$-$$-$$-$
$---+++$
$++++++$
$------$
\end{document}
结果:
为了与其他标志对齐a
,A
我0
建议您为所有标志制作宏并手动设置宽度为最宽的宽度之一(应该是$+$
)。
\hbox to <length>{\hss <sign>\hss}
这可以用(TeX) 或(LaTeX)来完成\makebox[<length>][c]{<sign>}
。宽度由 提供\settowidth{<length register>}{<content>}
。
\documentclass[11pt, a4paper]{scrreprt}
\usepackage{booktabs}
\newlength{\slength}
\settowidth{\slength}{$+$}
\newcommand*{\Sz}{\makebox[\slength][c]{0}}
\newcommand*{\SA}{\makebox[\slength][c]{A}}
\newcommand*{\Sa}{\makebox[\slength][c]{a}}
\newcommand*{\Sp}{\makebox[\slength][c]{$+$}}
\newcommand*{\Sm}{\makebox[\slength][c]{$-$}}
\begin{document}
\begin{tabular}{cc}
\toprule
1 & \Sp\Sp\Sm \\
2 & \Sp\Sm\Sp \\
3 & \Sm\Sp\Sp \\
4 & \Sz\Sz\Sz \\
5 & \Sm\Sm\Sm \\
6 & \Sz\Sz\Sz \\
\midrule
7 & \Sm\Sp\Sm \\
8 & \Sz\Sz\Sz \\
9 & \Sp\Sm\Sm \\
10 & \Sm\Sm\Sp \\
11 & \Sp\Sp\Sp \\
12 & \Sz\Sz\Sz \\
\midrule
13 & \Sz\Sz\Sz \\
14 & \Sz\Sz\Sa \\
15 & \Sz\Sz\SA \\
16 & \Sz\SA\Sz \\
17 & \SA\Sz\Sz \\
18 & \Sz\Sa\Sz \\
19 & \Sa\Sz\Sz \\
20 & \Sz\Sz\Sz \\
\bottomrule
\end{tabular}
\end{document}
结果:
答案3
排版表格的一种可能形式是为每个字符使用一个表格列:
\documentclass[11pt, a4paper]{scrreprt}
\usepackage{booktabs}
\newcommand\Pl{${}+{}$}
\newcommand\Mi{${}-{}$}
\begin{document}
\begin{tabular}{cc@{\hspace{-2pt}}c@{\hspace{-2pt}}c}
\toprule
1 & \Pl & \Pl & \Mi \\
4 & 0 & 0 & 0 \\
12 & a & 0 & A \\
15 & 0 & 0 & A \\
\bottomrule
\end{tabular}
\end{document}
答案4
实现此目的的一种简单方法是使用等宽字体排版加号和减号\verb|+-+-|
然而问题使用您可能会遇到的逐字文本...另一个解决方案可能是使用\texttt
宏来获得您的优点等。这是一个例子:
\documentclass{article}
\usepackage[T1]{fontenc}
\newcommand\p{+}
\newcommand\m{-{}}
\begin{document}
\texttt{++---++}
\texttt{\p\p\m\m\m\p\p}
\texttt{++\m\m aA0}
\end{document}
您需要使用类似这样的宏来表示减号,因为否则,如果您使用该fontenc
包,它们会变成短划线。这也应该很容易地等宽字母。