我想创建一个自定义环境,用于在表格中排版和弦符号,其中最宽行的列宽自动调整,并且它们必须以|
模仿小节线的方式分隔。
有时,表格中的某一行比其他行的条数少。在这种情况下,我想将剩余的单元格合并在一起,请参阅我的示例。
这对于 \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 进行测试的原因)。