
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 innercustomthm
irá pisar no contador e definir o que é necessário para que os próximos \label
comandos 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 \theinnercustomthm
també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 innercustomthm
que 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) \theinnercustomthm
e chamar o ambiente “interno” que fará seu trabalho de compor a declaração.
A definição de customthm
pode 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 innercustomthm
em vez de customthm
. Então,programadores machistasutilize neste caso a versão interna das rotinas \begin
e \end
para 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 \newenvironment
define dois comandos \myenv
e \endmyenv
, onde \myenv
expande para ...start code...
e \endmyenv
expande 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 innercustomthm
ambiente como um ambiente de "Teorema" que utiliza o innercustomthm
contador. 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 customthm
ambiente, 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 X
qual o innercustomthm
ambiente é aplicado. Portanto, o customthm
ambiente é essencialmente igual ao innercustomthm
ambiente, exceto que \theinnercustomthm
primeiro é definido como igual a X
, onde X
está o argumento para o customthm
ambiente. Portanto, o efeito líquido é que este ambiente imprime: "Teorema X"...
Finalmente, você dissealterar o nome do ambiente (digamos mytheo
em 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}