\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}
参数#1
是abc
和参数#2
是def
(请注意,括号已从参数中删除)。如果我说\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}