将逗号分隔的参数从一个命令传递到另一个命令

将逗号分隔的参数从一个命令传递到另一个命令

我正在尝试减少自定义包的冗余代码行。我有两个命令几乎可以完成相同的任务:一个命令创建表格并用行填充表格,另一个命令仅生成行。

我想创建一个调用另一个命令。

而不是这样:

\def\RWAddTableRow#1/#2!{
 & \textbf{#1} \\
 & #2 \\ }

 \newcommand{\RemarksWriterRows}[1]{
    \renewcommand*{\do}[1]{\RWAddTableRow##1!}
        Remarks :
        \docsvlist{#1}
}


\newcommand{\RemarksWriterFull}[1]{
    \renewcommand*{\do}[1]{\RWAddTableRow##1!}
    \begin{tabular}{p{7cm} p{10cm}}
        Remarks :
        \docsvlist{#1}
    \end{tabular}
}

我正在尝试做这样的事情:

\def\RWAddTableRow#1/#2!{
 & \textbf{#1} \\
 & #2 \\ }

 \newcommand{\RemarksWriterRows}[1]{
    \renewcommand*{\do}[1]{\RWAddTableRow##1!}
        Remarks :
        \docsvlist{#1}
}

\newcommand{\RemarksWriterSmall}[1]{
    \begin{tabular}{p{7cm} p{10cm}}
        \RemarksWriterRows{\protect \noexpand #1}
    \end{tabular}
}

但是每次我向 传递多个参数时\RemarksWriter,只有第一个参数格式正确。第二个和第三个参数是连接在一起的……

我这样称呼它:\RemarksWriter{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}

我尝试使用\protect\noexpand,但每次参数都会被破坏……我很确定参数的保护存在问题。我对 LaTeX 的要求是否太多了?还是我误用了某些东西?谢谢!

%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%

编辑 :

以下是完整的代码。

示例.tex

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}

\usepackage{etoolbox}

\usepackage{My}

\begin{document}

Test0.

\medskip

\RemarksWriterSmall{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}

Test1.

\medskip

\RemarksWriterFull{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}

\medskip

Test2.

\medskip

\RemarksWriterSmall{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}

\medskip

Test3.

\end{document}

麦粒肿

\NeedsTeXFormat{LaTeX2e}

\ProvidesPackage{My}[Test.]

\RequirePackage{etoolbox}

\def\RWAddTableRow#1/#2!{
 & \textbf{#1} \\
 & #2 \\ }

\newcommand{\RemarksWriterRows}[1]{
    \renewcommand*{\do}[1]{\RWAddTableRow##1!}
        Remarks :
        \docsvlist{#1}
}


\newcommand{\RemarksWriterFull}[1]{
    \renewcommand*{\do}[1]{\RWAddTableRow##1!}
    \begin{tabular}{p{7cm} p{10cm}}
        Remarks :
        \docsvlist{#1}
    \end{tabular}
}


\newcommand{\RemarksWriterSmall}[1]{
    \begin{tabular}{p{7cm} p{10cm}}
        \RemarksWriterRows{#1}
    \end{tabular}
}

如您所见,如果编译,第一个\RemarksWriterSmall(Test0 和 Test1 之间)会产生奇怪的布局,但第二个(Test2 和 Test3 之间)不会。我不知道为什么。

奇怪的布局

答案1

\RemarksWriterSmall在第一种情况下不起作用的原因是它\RemarksWriterRows在内部使用,\do在第一个表格单元格中重新定义。这只是局部更改,在下一个表格单元格中\do具有旧的含义\noexpand,而不是预期的含义。

的第二种用法有效,因为它已经从\RemarksWriterSmall接管了 的全局变化,如果没有分组,这是一个“糟糕”的想法。\do\RemarksWriterFull

如果更改应在表格单元格中保留,则先存储with\do的旧定义,然后使用in并在with后恢复定义。\do\let\origdo\do\gdef\do\RemarksWriterRows\end{tabular}\let\do\origdo

但我更喜欢这个\RemarksWriterFull版本。

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}

\usepackage{etoolbox}

\usepackage{My}

\begin{document}

Test0.

\medskip

\meaning\do
\RemarksWriterSmall{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}
\meaning\do
Test1.

\medskip

\meaning\do
\RemarksWriterFull{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}
\meaning\do
\medskip

Test2.

\medskip

\meaning\do
\RemarksWriterSmall{Author1/My remarks, Author2/My other remarks, Author3/Last remarks}
\meaning\do

\medskip

Test3.

\end{document}

My.sty

\NeedsTeXFormat{LaTeX2e}

\ProvidesPackage{My}[Test.]

\RequirePackage{etoolbox}

\def\RWAddTableRow#1/#2!{%
 & \textbf{#1} \\
 & #2 \\ }

\newcommand{\RemarksWriterRows}[1]{
  \gdef\do##1{\RWAddTableRow##1!}
  Remarks Original:
  \docsvlist{#1}%
}




\newcommand{\RemarksWriterFull}[1]{%
  \begingroup
  \renewcommand*{\do}[1]{\RWAddTableRow##1!}
  \begin{tabular}{p{7cm} p{10cm}}
    Remarks :
    \docsvlist{#1}
  \end{tabular}
  \endgroup
}


\newcommand{\RemarksWriterSmall}[1]{
  \let\origdo\do
    \begin{tabular}{p{7cm} p{10cm}}
      \RemarksWriterRows{#1}
    \end{tabular}
  \let\do\origdo
}

在此处输入图片描述

相关内容