排版一系列等距离的字符?

排版一系列等距离的字符?

对于排版带有实验设计的表格,我必须在表格的某一列中排版诸如“+ - + +”、“- - - +”等字符串来表示所谓的实验运行模式(有时它们还包含“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}

结果:

结果


为了与其他标志对齐aA0建议您为所有标志制作宏并手动设置宽度为最宽的宽度之一(应该是$+$)。

\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}

结果:

结果 2

答案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包,它们会变成短划线。这也应该很容易地等宽字母。

相关内容