我的问题是,我是否可以重新定义现有命令(例如 \multicolumn)并使所需参数成为可选参数,而不会丢失多列的内容?另一种选择是获取多列的内容并将其传递给某个自定义命令。这可能吗?我已经阅读了有关 xparse 的信息,但我不知道如何在我的情况下使用它。如果能得到一些帮助或提示,我将不胜感激,谢谢。
我有以下代码:
\documentclass[a4paper,12pt,oneside]{scrbook}
\usepackage[dutch]{babel} %Quotes won't work without babel
\usepackage[utf8]{inputenc} %This is very important!
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage[pdfborder={0 0 0}, breaklinks=true, pdftex=true, raiselinks=true]{hyperref}
\usepackage{tabularx}
\newcolumntype{Y}{>{\raggedright}X}
\begin{document}
\section{Description}
\begin{tabularx}{\linewidth}{|Y|Y|}\hline
\multicolumn{2}{c}{some text}\\
\hline
\begin{itemize}
\item Fixing
\item Remastering
\item Converting
\item Control
\end{itemize}
& \begin{center} \resizebox{10cm}{!}{\includegraphics{picture.png}}\\ \textit{picturedescription}\end{center}
\tabularnewline \hline
\end{tabularx}
\end{document}
\end{comment}
代码是自动生成的,所以我对此没有影响,我的想法是更改 tabularx 环境并在自己的包中编辑 \multicolumn。我需要将文本包裹的图片放在右侧,将所有文本放在左侧,这可能吗,还是我走错了路?
答案1
这是一种使用方法包裹xparse
使前两个参数成为可选参数:
解释:
除非我们完全替换现有定义,否则命令重新定义通常是对现有命令的调整。因此,我们仍然需要访问原始功能。因此,命令重新定义通常分两个阶段完成:第一阶段是用新名称保存现有定义,第二阶段是在需要时使用这个旧定义。
首先将 的原始定义保存
\multicolumn
为\OldMulticolumn
。你可以这样做:\let\OldMulticolumn\multicolumn
在这种情况下
\let
是可以的,但是如果你想重新定义具有可选参数的宏,你必须\LetLtxMacro
使用包裹letltxmacro
。 的详细描述\LetLtxMacro
可以在这个问题中找到闭平方根符号。因此在这种情况下没有必要使用\LetLtxMacro
,但这样做是可以的。然后,我们
\multicolumn
根据需要重新定义并\OldMulticolumn
在需要调用原始multicolumn
功能时使用:\DeclareExpandableDocumentCommand{\multicolumn}{O{2} O{c |} m}{% \OldMulticolumn{#1}{#2}{#3}% }%
从链接参考
tabular
由于命令是在环境中使用,因此部分命令必须是可扩展的,这样才能\DeclareExpandableDocumentCommand
起作用。下一部分
{O{2} O{c |} m}
提供了这三个参数的规范。第一个
O{2}
表示第一个参数#1
是可选参数(在方括号中指定),如果未提供,则默认为。在此特定情况下,这是要跨越的2
列数。\multicolumn
接下来的
O{c |}
意思是,第二个参数#2
也是可选的,如果不提供,则默认为c |
。这是对齐规范,将是原始 的第二个参数\multicolumn
。最后一个参数是类型
m
,这意味着这是一个需要与通常的一起提供的强制性参数{}
。因此,根据 arg 规范
...{\MultiColumn}{O{2} O{c |} m}
(在这里使用不同的名称,以避免与现有的混淆\multicolumn
),以下三个是等效的:\\MultiColumn{xyz}% \\MultiColumn[2]{xyz}% \\MultiColumn[2][c |]{xyz}%
这三个都有参数
#1=2
,,#2=c |
。#3=xyz
更多详情请参阅包裹xparse
文档。
参考:
- 这
tabular
需要可扩展的内容。请参阅放错了 \omit。\multispan 和 \newcommand更多细节。
代码:
\documentclass{article}
\usepackage{xparse}
\usepackage{letltxmacro}
\LetLtxMacro{\OldMulticolumn}{\multicolumn}
\DeclareExpandableDocumentCommand{\multicolumn}{O{2} O{c |} m}{%
\OldMulticolumn{#1}{#2}{#3}%
}%
\begin{document}
\begin{tabular}{|l | l |l |}\hline
a & \multicolumn{some long centered content}\\\hline
b & c & d\\\hline
a & \multicolumn[2][l|]{left content}\\ \hline
\end{tabular}
\end{document}
以上是 的正常用法\multicolumn
。请注意,为了指定对齐方式,需要指定列数。当然可以增强宏以测试空参数并将其替换为默认值——即使用它\multicolumn}[][r |]{x}
相当于\multicolumn}[2][r |]{x}
。
但是,在我的例子中,表格中跨越的列数通常是固定的,因此我更喜欢交换选项的顺序,这样我就可以提供对齐方式。现在使用\multicolumn[r |]{right content}
我得到r
跨越列的右对齐内容2
:
代码:
\documentclass{article}
\usepackage{xparse}
\usepackage{letltxmacro}
\LetLtxMacro{\OldMulticolumn}{\multicolumn}
\DeclareExpandableDocumentCommand{\multicolumn}{O{c |} O{2} m}{%
\OldMulticolumn{#2}{#1}{#3}%
}%
\begin{document}
\begin{tabular}{|l | l |l |}\hline
a & \multicolumn{some long centered content}\\\hline
b & c & d\\\hline
a & \multicolumn[r |]{right content}\\ \hline
\end{tabular}
\end{document}