Ajuda explicando a sintaxe deste comando

Ajuda explicando a sintaxe deste comando

Quero definir um ambiente de teorema onde possa emitir a numeração manualmente, em vez de seguir algum contador interno. Olhando ao redor eu encontreiesseresponder. 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 estava tentando entender tudo no código, caso queira ajustá-lo um pouco (e também para saber o que estou colocando no meu documento) e estou um pouco travado.

Primeiramente, o \newenvironment possui a seguinte estrutura:

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

Entendo que o terceiro argumento foi deixado vazio; Não há problema com isso. Depois vem o \renewcommand, que tem a estrutura:

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

Aqui tenho dificuldade em acompanhar o que está acontecendo, já 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 disso fica ainda mais confuso, já que os comandos \theinnercustomthm, \innercustomthm e \endinnercustomthm parecem feitos sob medida para esta solução específica, e não entendo como eles 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.

Responder1

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 é propositalmente longo e pouco atraente: é muito improvável que tal nome entre em conflito com ambientes existentes ou imaginados.

Para a aplicação que temos em mente não precisamos realmente do contador, mas sim do fato de que qualquer chamada de innercustomthmirá pisar no contador e definir o que é necessário para que os próximos \labelcomandos utilizem o valor do contador. No entanto, o LaTeX não analisa 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 teoremas manualmente, pois precisamos citar teoremas com o mesmo número que possuem em outra publicação, portanto a numeração automática está fora de questão. Bem, criamos um wrapper innercustomthmque tomará como argumento o número que queremos que a instrução tenha.

Portanto, a ideia é iniciar um ambiente usando um argumento que será usado para redefinir (localmente) \theinnercustomthme chamar o ambiente “interno” que fará seu trabalho de compor a declaraçã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á com o erro de “ausente \end” mencionar innercustomthmem vez de customthm. Então,programadores machistasutilize neste caso a versão interna das rotinas \begine \endpara o ambiente “interno”: a escrituração já foi feita \begin{customthm}e não precisamos repeti-la. Então nós conseguimos

\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 faltam aparelhos? Outro (mau) hábito deprogramadores machistasque sabem que esses aparelhos são desnecessários e serão retirados de qualquer maneira.

Em caso de dúvida, utilize-os.

Responder2

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

A seguir, 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, \begin{customthm}[X]...\end{customthm}expande-se para:

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

Ou seja, \theinnercustomthmé redefinido para ser igual ao Xqual o innercustomthmambiente é aplicado. Portanto, o customthmambiente é essencialmente igual ao 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ê dissealterar o nome do ambiente (digamos mytheoem vez 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}

informação relacionada