解释:

解释:

我的问题是,我是否可以重新定义现有命令(例如 \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文档。

参考:

代码:

\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}

相关内容