Aide à expliquer la syntaxe de cette commande
Je veux définir un environnement de théorème où je peux émettre la numérotation manuellement au lieu de suivre un compteur interne. En regardant autour de moi, j'ai trouvé cette réponse. Là, ils proposent le code suivant comme solution:
\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
Le code fonctionne comme je veux, mais j'essayais de tout comprendre dans le code, au cas où je voudrais le peaufiner un peu (et aussi apprendre ce que je mets dans mon document) et je suis un peu coincé.
Tout d'abord, le \ newenvironment a la structure suivante:
\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}
Je comprends que le troisième argument est laissé vide; aucun problème avec ça. Vient ensuite la commande \ renew, qui a la structure:
\renewcommand{<cmd>}[<n-args>][<default>]{<text>}
Ici, j'ai du mal à suivre ce qui se passe, car aucun appareil dentaire n'est utilisé; J'ai pensé que la commande vous permettait peut-être de les omettre, mais je n'ai trouvé aucune information à ce sujet. Et après cela, cela devient encore plus déroutant, car les commandes \ theinnercustomthm, \ innercustomthm et \ endinnercustomthm semblent faites sur mesure pour cette solution particulière, et je ne comprends pas comment elles fonctionnent.
Une chose que j'ai remarquée, par exemple, est que changer le nom de l'environnement (disons mytheo au lieu de customthm) décompose le code.
Si quelqu'un peut expliquer ce qui se passe ou m'indiquer un manuel ou une page Web où je peux comprendre ce qui se passe, je l'apprécierais profondément.
Réponses
La première chose à noter est que
\newtheorem{innercustomthm}{Theorem}
fait en interne quelque chose de similaire à
\newenvironment{innercustomthm}[1][]{<begin>}{<end>}
où les codes <begin>et <end>ne sont pas préoccupants ici. Notez que l'environnement recherche un argument optionnel (une note de théorème ou une attribution). Il met également en place un compteur portant le même nom que l'environnement.
Le nom choisi est volontairement long et peu attrayant: il est très peu probable qu'un tel nom entre en conflit avec des environnements existants ou imaginaires.
Pour l'application que nous avons à l'esprit, nous n'avons pas vraiment besoin du compteur, mais plutôt du fait que tout appel de innercustomthmfera avancer le compteur et définira ce qui est nécessaire pour que les \labelcommandes suivantes utilisent la valeur du compteur. Cependant, LaTeX ne regarde pas la valeur elle-même, mais utilise la signification actuelle de \the<counter>, dans ce cas \theinnercustomthm. La signification de \theinnercustomthmest également utilisée pour numéroter l'environnement.
Notre idée est de numéroter manuellement les théorèmes, car nous devons citer les théorèmes avec le même numéro qu'ils ont sur une autre publication, donc la numérotation automatique est hors de question. Eh bien, nous créons un wrapper innercustomthmqui prendra comme argument le numéro que nous voulons que l'instruction ait.
L'idée est donc de démarrer un environnement en prenant un argument qui sera utilisé pour redéfinir (localement) \theinnercustomthmet appeler l'environnement «interne» qui fera son travail de composition de l'instruction.
La définition de customthmpourrait être
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
{\end{innercustomthm}}
mais cela a un petit inconvénient: si vous oubliez \end{customthm}, vous vous retrouverez avec l'erreur de "Manquant \end" mentionnant innercustomthmplutôt que customthm. Ainsi, les programmeurs macho utilisent dans ce cas la version interne des routines \beginet \endpour l'environnement «interne»: la comptabilité a déjà été faite par \begin{customthm}et nous n'avons pas besoin de la répéter. Alors on obtient
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
{\endinnercustomthm}
Eh bien, le code que vous citez est
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
Pourquoi les accolades manquantes? Une autre (mauvaise) habitude des programmeurs macho qui savent que ces accolades sont inutiles et seront supprimées de toute façon.
En cas de doute, utilisez-les.
Premièrement, nous devons nous demander ce qui \newvironment{myenv}{..start code...}{...end code...}fait réellement. En simplifiant légèrement, ce qui se passe, c'est que cela \newenvironmentdéfinit deux commandes \myenvet \endmyenv, où se \myenvdéveloppe en ...start code...et se \endmyenvdéveloppe en ...end code.... Lorsque vous écrivez, \begin{myenv}...\end{myenv}LaTeX remplace cet environnement par du code qui est (presque) équivalent à {\myenv ... \endmyend}. (Un peu plus se passe dans les coulisses.)
Ensuite, la ligne \newtheorem{innercustomthm}{Theorem}définit l' innercustomthmenvironnement comme un environnement "théorème" qui utilise le innercustomthmcompteur. En particulier, le "numéro du théorème" pour cet environnement est imprimé en utilisant \theinnercustomthm.
Considérons maintenant:
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
Cela définit l' customthmenvironnement, qui prend un argument #1. Par le premier paragraphe ci-dessus, se \begin{customthm}[X]...\end{customthm}développe pour:
{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}
Autrement dit, \theinnercustomthmest redéfini pour être égal à Xaprès quoi l' innercustomthmenvironnement est appliqué. Ainsi, l' customthmenvironnement est essentiellement le même que l' innercustomthmenvironnement, sauf qu'il \theinnercustomthmest d'abord défini comme égal à X, où Xest l'argument de l' customthmenvironnement. Donc, l'effet net est que cet environnement imprime: "Théorème X" ...
Enfin, vous avez dit que changer le nom de l'environnement (disons mytheoau lieu de customthm) casse le code . Si ce que j'ai dit est correct, cela ne peut pas être vrai! En effet, comme le montre le code suivant, le code fonctionne exactement de la même manière si on change le nom de l'environnement:
\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}