我有一个类,它定义以下内容:
% myclass.cls
\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
\newcommand*{\firstname}[1]{\def\@firstname{#1}}
\newcommand*{\lastname}[1]{\def\@lastname{#1}}
\newcommand*{\familyname}[1]{\def\@lastname{#1}}
\def\@familyname{\@lastname}
我的使用方法如下:
\documentclass[11pt, a4paper]{myclass}
%other aspects here
\input{common_personal.tex}
\begin{document}
\value{name}
在 中common_personal.tex
,我提供如下值:
\name{Amitav}{Mohanty}
我希望名称能够显示出来,但文档中\value{name}
没有显示值。我该如何正确操作?我也愿意接受有关文件安排的建议。name
答案1
对 OP 的根本误解在于 的含义\value
。与 OP 似乎表明的方式不同,\value
不提供给定名称的宏的替换文本。而是\value
提供参数的整数表示,该参数需要是计数器的名称。
典型用法是作为数学\ifnum
比较的一部分。例如,
\ifnum\value{equation}=3\relax Do something if Eq 3
\else Do something if not Eq 3\fi
在这种情况下,equation
是与文档中的公式计数相关联的计数器。如果我们查看\name
OP 似乎关注的宏,我们会发现它是一个宏,而不是计数器,因此\value{name}
没有合法的含义。
如果我们看看它\name
实际上做了什么,它会根据其两个参数设置另外两个宏的值。存储数据的宏名称为\@firstname
和\@lastname
。但是,由于这两个宏的名称中都有@
,因此默认情况下,用户代码无法访问它们,因为类/包定义期间的 catcode @
(11) 与用户代码执行期间的 catcode (12) 不同。
要使用用户代码访问这些宏值,用户有两种选择。一种是使用语法\csname
,如\csname @firstname\endcsname
和。另一种是在用户代码中(暂时)\csname @lastname\endcsname
更改的 catcode 。后一种方法是使用使 catcode =11,并使catcode =12。@
\makeatletter
@
\makeatother
@
这两个宏的调用\makeat...
通常应该围绕宏定义其中@
引用了宏名称。如果这些@
宏名称在宏之外直接使用,则\makeat...
命令可以直接围绕@
宏,如\makeatletter\@firstname{} \@lastname\makeatother
。
答案2
您还想定义用于传递数据的包装器。
当你这样做的时候\name{Amitav}{Mohanty}
,你正在做
\def\@firstname{Amitav}
\def\@lastname{Mohanty}
而 TeX 对此一无所知。正如 Steven 的回答中所解释的那样,\value
这是一个保留的内核命令,用于访问计数器的值。
假设您需要访问名称以便打印它,作为参数\author
或其他任何内容;也许您还需要访问姓氏或名字。
您可以为此目的设置一些命令。在里面myclass.cls
您可以执行
\newcommand{\usedata}[1]{\csname @usedata@#1\endcsname}
\newcommand{\@usedata@fullname}{\@firstname\space\@lastname}
\newcommand{\@usedata@firstname}{\@firstname}
\newcommand{\@usedata@lastname}{\@lastname}
因此你可以在文档中执行
\usedata{fullname}
\usedata{firstname}
\usedata{lastname}
这个想法是\usedata
从其参数构建一个控制序列,您可以自由定义这些连接的命令。例如
\usedata{firstname}
会变成
\csname @usedata@firstname\endcsname
这相当于\@firstname
根据定义进行调用,并且这里存储了名字。