
私は 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}