
Ich bin gerade erst mit LaTeX angefangen und habe bereits mit den ganz grundlegenden Dingen Probleme.
Ich erstelle zwei Befehle, die jeweils einer Variablen einen Wert zuweisen:
\newcommand{\firstname}[1]{\def\@firstname{#1}}
\newcommand{\lastname}[1]{\def\@lastname{#1}}
Diese Variablen werden mithilfe der Befehle irgendwo am Anfang des Dokuments festgelegt:
\firstname{Kevin}
\lastname{De Coninck}
Wenn ich versuche, das zu drucken lastname
, funktioniert alles einwandfrei. Wenn ich versuche, das zu drucken firstname
, wird der folgende Fehler zurückgegebenUse of \@ doesn't match its definition. \@f
Ich drucke in meinem Dokument mit dem folgenden Code:
\begin{document}
\@firstname
\end{document}
Was übersehe ich hier?
Update: Gesamtes Dokument
% ----------------------------------------------------------------------
% -- 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}
Antwort1
\makeatletter...\makeatother
Ich habe die üblichen Paare um die Definitionen und die Verwendung herum hinzugefügt .
Bitte behalten Sie auch den Vorschlag von Daleif im Hinterkopf: \CMPLXfirstname
scheint besser und einfacher zu sein.
Ich habe auch geändert \RequirePackage
in \usepackage
(wobei das erste auch erlaubt ist, aber eher nur für Pakete gedacht ist, nicht für normale Dokumente)
Jetzt @
ist dies ein Sonderzeichen, das als Teil von Namen interner Befehle reserviert ist, auf die ein normaler Dokumentbenutzer nicht ohne weiteres zugreifen sollte. Außerhalb von Paketen oder Klassendateien @
wird dies nicht als zulässiger Buchstabe für Befehlsnamen angesehen. Daher \makeatletter
wird dies (vorübergehend) geändert, sodass es @
Teil solcher Namen sein kann, und \makeatother
dies wird rückgängig gemacht.
% ----------------------------------------------------------------------
% -- 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}
Antwort2
Falls Sie \makeatletter
.. nicht verwenden möchten \makeatother
, können Sie Folgendes verwenden
\csname..\endcsname
:
\csname @firstname\endcsname
→ \@firstname
.
\csname @lastname\endcsname
→ \@lastname
.
Ich habe einen kleinen Wrapper geschrieben für \csname..\endcsname
:
Das Makro \CreateCsFromName
funktioniert wie folgt:
\CreateCsFromName<preceding tokens with no curly braces>{ControlSequence}
→ <preceding tokens with no curly braces>\ControlSequence
.
Wenn Sie weglassen <preceding tokens with no curly braces>
, das heißt, wenn Sie es <preceding tokens with no curly braces>
leer lassen, \CreateCsFromName
wird das Steuersequenz-Token einfach aus dem Namen der Steuersequenz konstruiert:
\CreateCsFromName{macro}
→ \macro
Anstatt das Feld <preceding tokens with no curly braces>
leer zu lassen, können Sie beliebige Befehle zum (Neu-)Definieren angeben:
\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}
Beispiel:
\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}