
저는 이제 막 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}