如何向 \cline 类宏添加参数?

如何向 \cline 类宏添加参数?

\hline我想要实用宏,允许我更改s 或s\cline中的 s的 (a) 厚度和/或 (b) 颜色tabular。我希望无需重新定义即可做到这一点\arrayrulewidth,而是通过修改现有的\hline\cline宏来使用我想要的厚度代替\arrayrulewidth

\hline我首先通过添加规则厚度的参数来实现这一点Martin Scharrer 的答案\thickhline。见\hlineThickness下文。我通过添加第二个颜色参数完成了目标;见\hlineThicknessColor下文。效果如预期。

我希望也能对 做同样的事情\cline。我用过Masroor 的回答首先\clineThickness使用两个参数进行定义;第一个参数用于指定列的范围,\cline第二个参数用于指定规则的宽度。\clineThickness调用一个带有三个参数的宏\@ClineThickness。第一个参数\clineThickness显然被解析为两个参数,一个用于初始列,一个用于最终列。正如预期的那样:我可以改变黑色的粗细\cline

当我尝试为颜色定义添加新的第三个参数时,我遇到了麻烦\clineThicknessColor。首先,我根本不了解 TeX,所以我不明白如何\cline将第一个参数(包含一系列列)解析为两个单独的参数。

尽管如此,我还是尝试添加第三个参数,只需将#3(a) 添加到 的定义中,将\clineThickness(b) 添加到 的调用中\@ClineThickness,并添加到#4的定义中即可\@ClineThickness。但是,甚至没有尝试使用新参数,我就得到了错误“非法测量单位 (pt 插入)”。

下面是一个 MWE。有两行被注释掉了。首先,我将其注释掉, \clineThicknessColor{2-3}{1.5pt}{blue}以便可以编译。

其次,我进行了注释,\leaders\color{#4}\hrule\@height#3\hfill只是为了表明如果我能够首先成功添加该参数,我计划如何使用新的颜色参数。

我在尝试添加颜色参数时做错了什么\clineThicknessColor

\documentclass{article}
\usepackage{xcolor}

\makeatletter
\newcommand{\hlineThickness}[1]{%
%   Example usage: \hlineThickness{2pt}
%   Inspired by Martin Scharrer's answer https://tex.stackexchange.com/a/41761/7922
    \noalign {\ifnum 0=`}\fi \hrule height #1
    \futurelet \reserved@a \@xhline
}

\newcommand{\hlineThicknessColor}[2]{%
%   Example usage: \hlineThicknessColor{0.6pt}{red}
    \noalign {\ifnum 0=`}\fi \color{#2}\hrule height #1
    \futurelet \reserved@a \@xhline
}

\def\clineThickness#1#2{\@ClineThickness#1#2\@nil}
%   Example usage: \ClineThickness{2-5}{2.0pt}
%   Source: Masroor's answer https://tex.stackexchange.com/a/173535/7922
\def\@ClineThickness#1-#2#3\@nil{%
  \omit
  \@multicnt#1%
  \advance\@multispan\m@ne
  \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
  \@multicnt#2%
  \advance\@multicnt-#1%
  \advance\@multispan\@ne
  \leaders\hrule\@height#3\hfill
  \cr}

\def\clineThicknessColor#1#2#3{\@ClineThicknessColor#1#2#3\@nil}
%   Example usage: \clineThicknessColor{2-3}{1.5pt}{blue}
\def\@ClineThicknessColor#1-#2#3#4\@nil{%
    \omit
    \@multicnt#1%
    \advance\@multispan\m@ne
    \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
    \@multicnt#2%
    \advance\@multicnt-#1%
    \advance\@multispan\@ne
    \leaders\hrule\@height#3\hfill
%   \leaders\color{#4}\hrule\@height#3\hfill
    \cr}
\makeatother

\begin{document}
\begin{tabular}{c | c | c | c}
A & B & C & D\\
\hlineThickness{2pt}
E & F & G & H\\
\hlineThicknessColor{0.6pt}{red}
I & J & K & L\\
\clineThickness{2-3}{1.5pt}
M & N & O & P\\
%\clineThicknessColor{2-3}{1.5pt}{blue}
\end{tabular}
\end{document}

在此处输入图片描述

答案1

您几乎已经掌握了它,您只需\@ClineThicknessColor稍微重新排列参数规范,并在参数周围添加额外的括号。

让我解释一下如何解析宏中的破折号。当您使用定义命令时\def,您会给出一个参数规范,它是 tex 在您使用该命令后希望看到的模式。例如,如果我说\def\test#1-#2{...}当我使用命令时\test,latex 期望看到一些(括号匹配的)任意标记,后跟一个破折号,后跟一个破折号,后跟一个标记或括号参数。例如,如果我说那么\test abc-def参数#1将是abc,参数#2将是d并且ef将留在输入流中。如果我说\test {abc}-{def}参数#1abc和参数#2def(请注意,括号已从参数中删除)。如果我说\test{abc-def}那么 tex 就不会在括号中看到破折号并继续寻找破折号。如果它找不到破折号,它会抛出一个错误。

因此,有一个标准技巧来解析参数,例如{abc-def}:我们利用从参数周围删除括号的事实,所以我说:

\def\mycommand#1{\myhelpercommand#1\@nil}
\def\myhelpercommand#1-#2\@nil{...} % do stuff here

标记 \@nil 的作用是作为第二个参数的分隔符——删除括号后,tex 就无法再在没有某个标记作为端点的情况下判断参数的结束位置。现在,如果我想将此模式与多参数命令一起使用,我需要记住替换 tex 从后面的参数中删除的括号,并且我应该将它们放在 :\@nil之后

\def\mycommand#1#2#3{\myhelpercommand#1\@nil{#2}{#3}}
\def\myhelpercommand#1-#2\@nil#3#4{...} % do stuff here

以下是添加了此修复的代码:

\documentclass{article}
\usepackage{xcolor}

\makeatletter
\newcommand{\hlineThickness}[1]{%
%   Example usage: \hlineThickness{2pt}
%   Inspired by Martin Scharrer's answer https://tex.stackexchange.com/a/41761/7922
    \noalign {\ifnum 0=`}\fi \hrule height #1
    \futurelet \reserved@a \@xhline
}

\newcommand{\hlineThicknessColor}[2]{%
%   Example usage: \hlineThicknessColor{0.6pt}{red}
    \noalign {\ifnum 0=`}\fi \color{#2}\hrule height #1
    \futurelet \reserved@a \@xhline
}

\def\clineThickness#1#2{\@ClineThickness#1#2\@nil}
%   Example usage: \ClineThickness{2-5}{2.0pt}
%   Source: Masroor's answer https://tex.stackexchange.com/a/173535/7922
\def\@ClineThickness#1-#2#3\@nil{%
  \omit
  \@multicnt#1%
  \advance\@multispan\m@ne
  \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
  \@multicnt#2%
  \advance\@multicnt-#1%
  \advance\@multispan\@ne
  \leaders\hrule\@height#3\hfill
  \cr}

\def\clineThicknessColor#1#2#3{\@ClineThicknessColor#1\@nil{#2}{#3}}
%   Example usage: \clineThicknessColor{2-3}{1.5pt}{blue}
\def\@ClineThicknessColor#1-#2\@nil#3#4{%
    \omit
    \@multicnt#1%
    \advance\@multispan\m@ne
    \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
    \@multicnt#2%
    \advance\@multicnt-#1%
    \advance\@multispan\@ne
    \color{#4}
    \leaders\hrule\@height#3\hfill
    \leaders\hrule\@height#3\hfill
    \cr}
\makeatother

\begin{document}
\begin{tabular}{c | c | c | c}
A & B & C & D\\
\hlineThickness{2pt}
E & F & G & H\\
\hlineThicknessColor{0.6pt}{red}
I & J & K & L\\
\clineThickness{2-3}{1.5pt}
M & N & O & P\\
\clineThicknessColor{2-4}{1.5pt}{blue}
\end{tabular}
\end{document} 

相关内容