我正在尝试减少自定义包的冗余代码行。我有两个命令几乎可以完成相同的任务:一个命令创建表格并用行填充表格,另一个命令仅生成行。
我想创建一个调用另一个命令。
而不是这样:
\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
}