정의하면 \bletter
섹션 \DeclareRobustCommand\bletter[1]{\textbf{#1}}
명령 내에서도 잘 작동합니다. 그러나 \edef
or \xdef
명령 에서 사용하려는 경우에는 \bletter
손상됩니다(정의하는 경우 제외 \let\protect\noexpand
). 그 의미는:
\xdef\boldyletter{\bletter{y}}
오류 메시지가 표시됩니다.
항상 깨지지 않는 명령을 정의하는 명령이 있습니까?
답변1
당신이 사용할 수있는
\NewDocumentCommand\bletter{m}{\textbf{#1}}
\protected
이는 edef에서 확장되지 않는 e-tex 정의를 만듭니다 .
그러나 \xdef
알 수 없는 라텍스 입력에는 절대 사용하면 안 됩니다. \protected@xdef
그러면 LaTeX 강력한 명령이 보호됩니다.
답변2
\protected\def
매크로 선언에 기본 요소를 사용하면 됩니다 \bletter
.
\protected\def\bletter#1{\textbf{#1}}
, , 등 중에는 매크로 \protected
가 확장되지 않습니다 .\edef
\xdef
\write
\message
답변3
내 질문에 답변해서 죄송합니다. 하지만 내 솔루션을 커뮤니티와 공유하는 방법을 모르겠습니다.
\def\RJDeclareRobustCommand#1% #1 name of new command, #2 same instructions as \newcommand
{%
\gdef#1%
{%
\begingroup%
\let\relax\aftergroup% this has to be redefined before processing \csname @\string#1\endcsname
\ifx\aftergroup\relax% this is false in expandations
\expandafter\aftergroup\csname RJ@\expandafter\@gobble\string#1\endcsname%
\else% \expandafter\aftergroup\expandafter\noexpand\csname\expandafter\@gobble\string#1@RJ\endcsname%
\fi%
\endgroup%
}%
\expandafter\gdef\csname\expandafter\@gobble\string#1@RJ\endcsname%
{%
\begingroup%
\let\relax\aftergroup% this has to be redefined before processing \csname @\string#1\endcsname
\ifx\aftergroup\relax% this is false in expandations
\expandafter\aftergroup\csname RJ@\expandafter\@gobble\string#1\endcsname%
\else%
\expandafter\aftergroup\expandafter\aftergroup\expandafter\aftergroup%
\expandafter\noexpand\csname\expandafter\@gobble\string#1@RJ\endcsname%
\fi%
\endgroup%
}%
% read the instructions (see \new@command)
\expandafter\new@command\csname RJ@\expandafter\@gobble\string#1\endcsname%
}%
%
\RJDeclareRobustCommand\bletter[1]{\textbf{#1}}
튼튼할 것입니다.
\xdef\boldyletter{\bletter{y}}
명령에서도 잘 작동합니다 \xdef\boldxyletter{x\boldyletter}}
.
답변4
매우 유용한 답변에 감사드립니다. 그것은 나에게도 도전이었고 나는 그것을 기꺼이 받아들였습니다.
장 제목에서 새 명령을 사용하려면 무엇보다도 \pdfstringdef에 명령을 추가하고 재정의해야 합니다. 내 이전 코드에서는 이것이 고려되지 않았습니다. 이 요구사항을 추가하면서 코드도 최적화할 수 있었습니다.
아래는 새로운 코드를 사용한 테스트 예시입니다. 인수가 아닌 새 명령은 책갈피에서 무시됩니다.
\documentclass[a4paper,12pt]{report}
\RequirePackage[pdftex,colorlinks,linkcolor=blue,%
urlcolor=blue,bookmarksnumbered]{hyperref}
%
\makeatletter
%
\let\RJ@aftergroup\aftergroup%
\let\RJ@begingroup\begingroup%
\let\RJ@endgroup\endgroup%
\let\RJ@let\let%
%
\@ifundefined{pdfstringdefPreHook}{}%
{%
\gdef\Addpdfstringdef#1%
{%
\global\@temptokena\expandafter%
{\pdfstringdefPreHook#1}%
\xdef\pdfstringdefPreHook{\the\@temptokena}%
}%
%
\Addpdfstringdef%
{%
\let\RJ@aftergroup\@empty%
\let\RJ@begingroup\@empty%
\let\RJ@endgroup\@empty%
\let\RJ@let\@empty%%
}%
}%
%
\def\RJ@DRCentry#1%
{%
\RJ@begingroup%
\RJ@let\relax\RJ@aftergroup%
\ifx\RJ@aftergroup\relax%
\expandafter\RJ@aftergroup\csname RJ@\expandafter\@gobble\string#1\endcsname%
\else%
\expandafter\noexpand\csname RJ\expandafter\@gobble\string#1JR\endcsname%
\fi%
\RJ@endgroup%
}%
%
\def\RJ@DeclareRobustCommand#1% #1 name of new command, #2 same instructions as \newcommand
{%
\gdef#1%
{%
\ifx\RJ@aftergroup\@empty%
\else%
\expandafter\RJ@DRCentry\expandafter#1%
\fi%
}%
%
\expandafter\gdef\csname RJ\expandafter\@gobble\string#1JR\endcsname%
{%
\ifx\RJ@aftergroup\relax%
\gdef\next{\RJ@DRCentry{#1}}%
\RJ@aftergroup\next%
\else%
\expandafter\noexpand\csname RJ\expandafter\@gobble\string#1JR\endcsname%
\fi%
}%
%
\@ifundefined{pdfstringdefPreHook}{}%
{%
\expandafter\Addpdfstringdef\expandafter%
{\expandafter\let\csname RJ\expandafter\@gobble\string#1JR\endcsname\@empty}%
}%
\expandafter\new@command\csname RJ@\expandafter\@gobble\string#1\endcsname%
}%
%
\RJ@DeclareRobustCommand\iletter[1]{\textit{\huge #1}}%
%
\xdef\yiletter{\iletter{y}}%
\xdef\xyiletter{\iletter{x}\yiletter}%
\xdef\xyziletter{\xyiletter\iletter{z}}%
\xdef\jiletter{\iletter{j\iletter{i}}}%
\begin{document}
\tableofcontents
\newpage
test \iletter{j\iletter{i}}, \jiletter{} test \iletter{a}, \yiletter, \xyiletter, \xyziletter{} test
\section{italic \iletter{y}, \xyziletter}
The following chapter heading is for comparison purposes only .
\section{italic \textit{\huge y}, \textit{\huge xyz}}
more text
\end{document}