NiceTabular 和 \multicolumn 的列分隔符问题

NiceTabular 和 \multicolumn 的列分隔符问题

我想创建一个自定义环境,用于在表格中排版和弦符号,其中最宽行的列宽自动调整,并且它们必须以|模仿小节线的方式分隔。

有时,表格中的某一行比其他行的条数少。在这种情况下,我想将剩余的单元格合并在一起,请参阅我的示例。

这对于 \multicolumn 来说可以正常工作,但是当我在某一行的第一个单元格中使用它时却不行,因为它会以某种方式删除第一个列分隔符(又称小节线)。

如果此行为是所有列的默认行为,我宁愿创建一个命令 \gobblebars,它只删除所有剩余的小节线,包括命令前面的小节线。这将是更好的解决方案,因为它更易于使用。

梅威瑟:

\documentclass[a4paper]{article}
\usepackage{nicematrix}

\renewcommand{\familydefault}{\ttdefault}


\newenvironment{bars*}[1]{%
    \setlength{\tabcolsep}{3.5pt}%
    \begin{NiceTabular}[t]{*{#1}{@{|}l}}[columns-width=auto]%
}{%
    \end{NiceTabular}%
}

\newcommand{\mergebars}[2]{\multicolumn{#1}{@{}l}{#2 \phantom{X}}}
\newcommand{\gobblebars}[1]{\multicolumn{#1}{@{}l}{}}


\begin{document}

\begin{bars*}{4}
    B & E & F\# & G\#m \\
    B & \mergebars{3}{E F\#} \\
    \mergebars{4}{B} \\
    B & \gobblebars{3} \\
\end{bars*}

\end{document}

在此处输入图片描述

第 1 行:这只是普通的争吵,没什么特别的

第 2 行:\multicolumn 适用于列数大于 1 的情况

第 3 行:\multicolumn 删除第一个列分隔符,也称为横线,这不是我想要的

第 4 行:我宁愿有一个命令 \gobblebars,它的行为类似于 \multicolumn 在第一列中所做的那样,并删除它前面的列分隔符,但它没有

问题:

是否可以按照描述创建命令 \gobblebars?如果不能,如何使用 \multicolumn 不删除在第一列调用的第一个列分隔符?

我无法|直接在单元格内容中使用,因为我将其用作 leadsheets 包的歌曲环境中的改变的活动字符。

答案1

编辑

事实上,在您对{bars*}, you should probably replace@{|} by@{>}>{|} (it's not equivalent because@{...} puts its content in the *previous* cell ---except for the first cell of the row of course--- whereas>{...} 的定义中,将其内容放在下一个单元格中。

\documentclass[a4paper]{article}
\usepackage{nicematrix}

\renewcommand{\familydefault}{\ttdefault}

\newenvironment{bars*}[1]{%
    \setlength{\tabcolsep}{3.5pt}%
    \begin{NiceTabular}[t]{*{#1}{@{}>{|}l}}[columns-width=auto]%
}{%
    \end{NiceTabular}%
}

\newcommand{\mergebars}[2]
  { \multicolumn{#1}{@{|}l}{#2 \phantom{X}} }

\newcommand{\gobblebars}[1]{\multicolumn{#1}{@{}l}{}}

\begin{document}

\begin{bars*}{4}
    B & E & F\# & G\#m \\
    B & \mergebars{3}{E F\#} \\
    \mergebars{4}{B} \\
    B & \gobblebars{3} \\
\end{bars*}

\end{document}

上述代码的输出


这是对您的命令的修改\mergebars,其行为符合您的期望。

\documentclass[a4paper]{article}
\usepackage{nicematrix}

\renewcommand{\familydefault}{\ttdefault}

\newenvironment{bars*}[1]{%
    \setlength{\tabcolsep}{3.5pt}%
    \begin{NiceTabular}[t]{*{#1}{@{|}l}}[columns-width=auto]%
}{%
    \end{NiceTabular}%
}

\ExplSyntaxOn
\makeatletter
\newcommand{\mergebars}[2]
  { \multicolumn{#1}{@{\int_compare:nNnT \c@jCol = 0 {|}}l}{#2 \phantom{X}} }
\makeatother
\ExplSyntaxOff

\newcommand{\gobblebars}[1]{\multicolumn{#1}{@{}l}{}}

\begin{document}

\begin{bars*}{4}
    B & E & F\# & G\#m \\
    B & \mergebars{3}{E F\#} \\
    \mergebars{4}{B} \\
    B & \gobblebars{3} \\
\end{bars*}

\end{document}

评论

该包nicematrix在其环境中提供了 LaTeX 计数器jCol(其 TeX 名称为\c@jCol),用于表示当前列的编号。但是,它在单元格开始时递增,而在 中\multicolumn,它尚未递增(这就是为什么我\c@jCol针对 0 而不是 1 进行测试的原因)。

上述代码的输出

相关内容