我想创建一个目前超出我能力范围的命令,所以我想知道周围是否有人可以帮助我。
我想要做的是定义一个类似于以下内容的新命令:
\cmd{reference001}{Title}{text A}{text B}{text C}
此命令随后会创建一个名为的新命令,\reference001
其将显示:
但是,我还希望该\cmd
命令能够定义其他仅显示输入部分内容的新命令。例如,它应该生成一个\reference001title
将显示的命令Title
和一个\reference001partB
将显示的命令text B
,等等。
重要的是,我非常希望我的命令名称中包含数字(如这个答案)。我把到目前为止尝试过的方法汇总如下,但是我无法消除所有错误,尤其是无法让数字作为命令名称的一部分。
为了实现这一点,我还考虑定义一个自定义标签/参考系统(通过这个问题) 对我来说也是一个完美的解决方案。例如,\cmd
上面的代码将创建多个标签,可以引用为\ref{reference001}
、\ref{reference001partA}
等。但是我也无法让它工作。
\documentclass{article}
\newcommand{\cmd}[5]{
\expandafter\newcommand\csname #1\endcsname{
\textbf{#2}
\textbf{\textit{Part A:}} #3
\textbf{\textit{Part B:}} #4
\textbf{\textit{Part C:}} #5
}
\expandafter\newcommand\csname #1title\endcsname{#2}
\expandafter\newcommand\csname #1partA\endcsname{#3}
\expandafter\newcommand\csname #1partB\endcsname{#4}
\expandafter\newcommand\csname #1partC\endcsname{#5}
}
\begin{document}
\cmd{reference}{Title}{text A}{text B}{text C}
\reference
\referencepartA
\referencepartB
\referencepartC
\end{document}
答案1
如果您不需要在文本上换行,这可能是\cmd
您所设想的核心。
\documentclass[12pt]{article}
\usepackage{etoolbox}
\usepackage[usestackEOL]{stackengine}
\newcommand\cmd[5]{%
\csdef{#1title}{#2}%
\csdef{#1partA}{#3}%
\csdef{#1partB}{#4}%
\csdef{#1partC}{#5}%
\csdef{#1}{%
\Longunderstack[l]{
\textbf{#2}\\
\textbf{\textit{Part A}:} #3\\
\textbf{\textit{Part B}:} #4\\
\textbf{\textit{Part C}:} #5\strut
}%
}%
}
\cmd{reference001}{Title}{text A}{text B}{text C}
\begin{document}
Here is ``\csuse{reference001partB}'' and here is the full reference:
\csuse{reference001}
\end{document}
答案2
\CallMacro
您可以实现一个利用大括号分隔参数的宏,并\csname..\endcsname
在需要时翻转宏参数,为您完成工作 - 不需要花哨的包:
\documentclass{article}
%%----------------------------------------------------------------------
%% Put a control sequence token in place instead of the string denoting
%% its name:
%%......................................................................
%% \CallMacro<emptiness or tokens other than braces>{<Name of Control Sequence>}
%%
%% yields:
%%
%% <emptiness or tokens other than braces>\Controlsequence
%%
%% E.g.,
%%
%% \CallMacro foo{bar} -> foo\bar
%% \CallMacro{bar} -> \bar
%% \CallMacro\newcommand*{wEirdName}[1]{Arg 1: (#1)}
%% -> \newcommand*\wEirdName[1]{Arg 1: (#1)}
%%
\newcommand\CallMacroIII[2]{#2#1}%
\newcommand\CallMacro{}\long\def\CallMacro#1#{\romannumeral\CallMacroII{#1}}%
\newcommand\CallMacroII[2]{%
\expandafter\CallMacroIII\expandafter{\csname#2\endcsname}{0 #1}%
}%
%
\newcommand\cmd[5]{%
\CallMacro\newcommand{#1}{%
\vtop{%
\hbox{\noindent\textbf{#2}\strut}%
\hbox{\textbf{\textit{Part A: }}#3\strut}%
\hbox{\textbf{\textit{Part B: }}#4\strut}%
\hbox{\textbf{\textit{Part C: }}#5\strut}%
}%
}%
\CallMacro\newcommand{#1title}{#2}%
\CallMacro\newcommand{#1partA}{#3}%
\CallMacro\newcommand{#1partB}{#4}%
\CallMacro\newcommand{#1partC}{#5}%
}%
\begin{document}
\cmd{reference001}{Title}{text A}{text B}{text C}
\verb|\CallMacro{reference001}|:
\CallMacro{reference001}
\hrulefill
\verb|\CallMacro{reference001title}|:
\CallMacro{reference001title}
\hrulefill
\verb|\CallMacro{reference001partA}|:
\CallMacro{reference001partA}
\hrulefill
\verb|\CallMacro{reference001partB}|:
\CallMacro{reference001partB}
\hrulefill
\verb|\CallMacro{reference001partC}|:
\CallMacro{reference001partC}
\end{document}