Ajuda explicando a sintaxe deste comando

Sep 10 2020

Quero definir um ambiente de teorema onde posso emitir a numeração manualmente em vez de seguir algum contador interno. Olhando em volta, encontrei esta resposta. Lá eles propõem o seguinte código como solução:

\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

O código funciona como eu quero, porém eu estava tentando entender tudo no código, caso eu queira ajustá-lo um pouco (e também aprender o que estou colocando no meu documento) e estou um pouco travado.

Em primeiro lugar, o \ newenvironment tem a seguinte estrutura:

\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}

Eu entendo que o terceiro argumento foi deixado em branco; Não há problema com isso. Em seguida, vem o comando \ renew, que tem a estrutura:

\renewcommand{<cmd>}[<n-args>][<default>]{<text>}

Aqui eu tenho problemas para acompanhar o que está acontecendo, uma vez que nenhum aparelho está sendo usado; Achei que talvez o comando permitisse omiti-los, mas não encontrei nenhuma informação sobre isso. E depois fica ainda mais confuso, pois os comandos \ theinnercustomthm, \ innercustomthm e \ endinnercustomthm aparecem customizados para esta solução em particular, e não entendo como funcionam.

Uma coisa que notei, por exemplo, é que alterar o nome do ambiente (digamos mytheo em vez de customthm) quebra o código.

Se alguém puder explicar o que está acontecendo ou me indicar algum manual ou página da web onde eu possa entender o que está acontecendo, eu agradeceria profundamente.

Respostas

1 egreg Sep 10 2020 at 15:27

A primeira coisa a notar é que

\newtheorem{innercustomthm}{Theorem}

internamente faz algo semelhante a

\newenvironment{innercustomthm}[1][]{<begin>}{<end>}

onde os códigos <begin>e <end>não são uma preocupação aqui. Observe que o ambiente procura um argumento opcional (uma nota de teorema ou atribuição). Também configura um contador com o mesmo nome do ambiente.

O nome escolhido é longo e desagradável propositalmente: é muito improvável que tal nome entre em conflito com ambientes existentes ou imaginários.

Para a aplicação, temos em mente que não precisamos realmente do contador, mas sim o fato de que qualquer chamada de innercustomthmirá mover o contador e definir o que é necessário para que os próximos \labelcomandos usem o valor do contador. No entanto, o LaTeX não olha para o valor em si, mas usa o significado atual de \the<counter>, neste caso \theinnercustomthm. O significado de \theinnercustomthmtambém é usado para numerar o ambiente.

Nossa ideia é numerar os teoremas manualmente, porque precisamos citar teoremas com o mesmo número que eles têm em outra publicação, portanto, a numeração automática está fora de questão. Bem, nós criamos um invólucro innercustomthmque tomará como argumento o número que queremos que a instrução tenha.

Portanto, a ideia é iniciar um ambiente pegando um argumento que será usado para redefinir (localmente) \theinnercustomthme chamar o ambiente “interno” que fará seu trabalho de composição da instrução.

A definição de customthmpode ser

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
  {\end{innercustomthm}}

mas isso tem uma pequena desvantagem: se você esquecer \end{customthm}, acabará cometendo o erro de “Falta \end” mencionar em innercustomthmvez de customthm. Assim, os programadores machistas usam, neste caso, a versão interna das rotinas \begine \endpara o ambiente “interno”: a escrituração já foi feita por \begin{customthm}e não precisamos repeti-la. Então nós temos

\newenvironment{customthm}[1]
  {\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
  {\endinnercustomthm}

Bem, o código real que você cita é

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Por que o aparelho está faltando? Outro (mau) hábito dos programadores machistas que sabem que essas chaves são desnecessárias e serão removidas de qualquer maneira.

Em caso de dúvida, use-os.

Noname Sep 10 2020 at 14:35

Primeiro, devemos perguntar o que \newvironment{myenv}{..start code...}{...end code...}realmente faz. Simplificando um pouco, o que acontece é que \newenvironmentdefine dois comandos \myenve \endmyenv, onde se \myenvexpande para ...start code...e se \endmyenvexpande para ...end code.... Quando você escreve, o \begin{myenv}...\end{myenv}LaTeX substitui este ambiente por um código que é (quase) equivalente a {\myenv ... \endmyend}. (Um pouco mais acontece nos bastidores.)

Em seguida, a linha \newtheorem{innercustomthm}{Theorem}define o innercustomthmambiente como um ambiente de "Teorema" que utiliza o innercustomthmcontador. Em particular, o "número do teorema" para este ambiente é impresso usando \theinnercustomthm.

Agora vamos considerar:

\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

Isso define o customthmambiente, que leva um argumento #1. No primeiro parágrafo acima, se \begin{customthm}[X]...\end{customthm}expande para:

{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}

Ou seja, \theinnercustomthmé redefinido para ser igual Xapós o qual o innercustomthmambiente é aplicado. Portanto, o customthmambiente é essencialmente o mesmo que o innercustomthmambiente, exceto que \theinnercustomthmprimeiro é definido como igual a X, onde Xestá o argumento para o customthmambiente. Portanto, o efeito líquido é que este ambiente imprime: "Teorema X" ...

Finalmente, você disse que alterar o nome do ambiente (digamos, em mytheovez de customthm) quebra o código . Se o que eu disse estiver correto, isso não pode ser verdade! Na verdade, como mostra o código a seguir, o código funciona exatamente da mesma maneira se alterarmos o nome do ambiente:

\documentclass{article}

\newtheorem{innercustomthm}{Theorem}
\newenvironment{mytheo}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

\begin{document}

  \begin{innercustomthm}Hi
  \end{innercustomthm}

  \begin{mytheo}Hi
  \end{mytheo}

\end{document}