Qual é o quinto valor possível de \ protect?

Sep 25 2020

A seção "11.4 Comandos robustos e \ proteger" de source2e.pdf (Arquivo d: ltdefns.dtx Data: 2020/02/27 Versão v1.5g) diz que \protectpode ter um dos cinco "valores" possíveis, mas lista apenas quatro deles:

  1. \relax
  2. \string
  3. \noexpand
  4. \@unexpandable@protect → \noexpand\protect\noexpand

Qual é o quinto valor / não listado?

Por que não está listado?

Respostas

8 UlrichDiez Sep 25 2020 at 06:45

Tenho source2e.pdf Data: 20/02/2004 Versão 1.3g em meu arquivo.

Diz:

O método que o LaTeX usa para tornar robustos comandos frágeis é precedê-los \protect. Isso pode ter um dos cinco valores possíveis:

  • \relax, para composição normal. Então \protect\foovai executar \foo.
  • \string, para escrever na tela. Então \protect\foovai escrever \foo.
  • \noexpand, para gravar em um arquivo. Então, \protect\foovai escrever \fooseguido por um espaço.
  • \@unexpandable@protect, para escrever um argumento móvel em um arquivo. Então, \protect\foovai escrever \protect\fooseguido por um espaço. Este valor também está dentro usado \edefs, \markse outros comandos que avaliam seus argumentos totalmente.
  • \@unexpandable@noexpand, para realizar uma gravação adiada dentro de um \edef. Então \protect\foo, escreverá \fooseguido por um espaço. Se você quer \protect\fooser escrito, você deve usar \@unexpandable@protect. (Removido como nunca usado).

Esses comandos são usados ​​para configuração \protectinterna \edefs.
192 \def\@unexpandable@protect{\noexpand\protect\noexpand}
193%\def\@unexpandable@noexpand{\noexpand\noexpand\noexpand}

8 DavidCarlisle Sep 25 2020 at 06:26

Atualização A documentação foi corrigida para o próximo lançamento para dizer quatro , demorou apenas 26 anos após a alteração do código para colocar a documentação em linha.


Logo abaixo da linha citada você vê

% \changes{1.1c}{1994/05/18}
%     {(ASAJ) Renamed the commands, and removed
%       one which is no longer needed.}

o que explica por que a lista é curta, agora estou tentando lembrar o que era. Eu tenho uma suspeita que era, \noexpand\noexpand\noexpandmas eu preciso verificar ...

Sim, o LaTeX2.09 source ( latex.tex) usa \noexpand\noexpand\noexpandem, por exemplo

\def\label#1{\@bsphack\if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%