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}

관련 정보