定義2個變數並列印它們

定義2個變數並列印它們

我剛開始使用 LaTeX,而且我已經在非常基本的東西上掙扎了。

我創建了 2 個命令,每個命令為一個變數分配一個值:

\newcommand{\firstname}[1]{\def\@firstname{#1}}
\newcommand{\lastname}[1]{\def\@lastname{#1}}

這些變數是使用文件開頭某處的命令設定的:

\firstname{Kevin}
\lastname{De Coninck}

當我嘗試列印 時lastname,一切正常,當我嘗試列印 時firstname,返回以下錯誤Use of \@ doesn't match its definition. \@f

我使用以下程式碼在我的文件中列印:

\begin{document}
    \@firstname
\end{document}

我在這裡缺少什麼?

更新:整個文檔

% ----------------------------------------------------------------------
% -- CONFIGURATION
% ----------------------------------------------------------------------
\documentclass[11pt, a4paper]{article}

% ----------------------------------------------------------------------
% -- PACKAGES
% ----------------------------------------------------------------------
\RequirePackage{geometry}

% ----------------------------------------------------------------------
% -- COMMAND DEFINITIONS
% ----------------------------------------------------------------------

% Summary: Configure the person's name.
% Usage:   \name{<firstname>}{<lastname>}
%          firstname{<firstname>}
%          lastname{<lastname>}
\newcommand{\firstname}[1]{\def\@firstname{#1}}
\newcommand{\lastname}[1]{\def\@lastname{#1}}

% ----------------------------------------------------------------------
% -- LAYOUT CONFIGURATION
% ----------------------------------------------------------------------
\geometry{left=2.0cm, top=5.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm}

% ----------------------------------------------------------------------
% -- PERSONAL DATA
% ----------------------------------------------------------------------
\firstname{Kevin}
\lastname{De Coninck}

% ----------------------------------------------------------------------
% -- ACTUAL DOCUMENT
% ----------------------------------------------------------------------
\begin{document}
    \@firstname
    \@lastname
\end{document}

答案1

\makeatletter...\makeatother我在定義和用法中添加了常用的一對。

也請牢記 daleif 的主張:\CMPLXfirstname似乎更好、更容易。

我也改為\RequirePackage\usepackage雖然第一個也是允許的,但僅適用於包,不適用於普通文件)

現在,@是作為內部命令名稱的一部分保留的特殊字符,普通文件使用者不應輕鬆存取該字符。套件或類別檔案之外@不被視為命令名稱允許的字母,因此\makeatletter(暫時)更改此名稱,允許@成為此類名稱的一部分並\makeatother恢復此名稱。

% ----------------------------------------------------------------------
% -- CONFIGURATION
% ----------------------------------------------------------------------
\documentclass[11pt, a4paper]{article}

% ----------------------------------------------------------------------
% -- PACKAGES
% ----------------------------------------------------------------------
\usepackage{geometry}

% ----------------------------------------------------------------------
% -- COMMAND DEFINITIONS
% ----------------------------------------------------------------------

% Summary: Configure the person's name.
% Usage:   \name{<firstname>}{<lastname>}
%          firstname{<firstname>}
%          lastname{<lastname>}
\makeatletter
\newcommand{\firstname}[1]{\def\@firstname{#1}}
\newcommand{\lastname}[1]{\def\@lastname{#1}}

 \newcommand{\printname}{%
  \@ifundefined{@firstname}{}{\@firstname} \@ifundefined{@lastname}{}{\@lastname}%
}

\makeatother

% ----------------------------------------------------------------------
% -- LAYOUT CONFIGURATION
% ----------------------------------------------------------------------
\geometry{left=2.0cm, top=5.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm}

% ----------------------------------------------------------------------
% -- PERSONAL DATA
% ----------------------------------------------------------------------
\firstname{Kevin}
\lastname{De Coninck}

% ----------------------------------------------------------------------
% -- ACTUAL DOCUMENT
% ----------------------------------------------------------------------
\begin{document}
\makeatletter
    \@firstname\ \@lastname
\makeatother

Or \printname%
\end{document}

在此輸入影像描述

答案2

如果您不想使用\makeatletter.. \makeatother,您可以使用
\csname..\endcsname

\csname @firstname\endcsname →  \@firstname
\csname @lastname\endcsname →  \@lastname

我寫了一個小包裝\csname..\endcsname

該巨集的\CreateCsFromName工作原理如下:

\CreateCsFromName<preceding tokens with no curly braces>{ControlSequence}
→  <preceding tokens with no curly braces>\ControlSequence

如果省略<preceding tokens with no curly braces>,即留空<preceding tokens with no curly braces>\CreateCsFromName則將僅根據控制序列的名稱建構控制序列標記:

\CreateCsFromName{macro}→ \macro

<preceding tokens with no curly braces>您可以提供用於(重新)定義的任何命令,而不是留空:

\CreateCsFromName\long\def{macro}→ \long\def\macro

\CreateCsFromName\long\def{macro}#1#2{First argument: #1, second argument: #2}
→ \long\def\macro#1#2{First argument: #1, second argument: #2}

\CreateCsFromName\newcommand*{macro}→ \newcommand*\macro

\CreateCsFromName\newcommand*{macro}[2]{First argument: #1, second argument: #2}
→ \newcommand*\macro[2]{First argument: #1, second argument: #2}

例子:

\documentclass{article}

\newcommand\Exchange[2]{#2#1}
\newcommand\CreateCsFromName{}
\long\def\CreateCsFromName#1#{\romannumeral0\InnerCreateCsFromName{#1}}
\newcommand\InnerCreateCsFromName[2]{%
  \expandafter\Exchange\expandafter{\csname#2\endcsname}{ #1}%
}

% raise an error in case \@firstname and \@lastname are already defined:
\CreateCsFromName\newcommand*{@firstname}{}
\CreateCsFromName\newcommand*{@lastname}{}

% commands for silently redefining \@firstname and \@lastname:
\newcommand{\firstname}{\CreateCsFromName\def{@firstname}}
\newcommand{\lastname}{\CreateCsFromName\def{@lastname}}

\firstname{Kevin}
\lastname{De Coninck}

\begin{document}

\CreateCsFromName{@firstname} \CreateCsFromName{@lastname}

\end{document}

相關內容