2009-10-14 11 views
17

J'ai utilisé \begin{figure} ... \end{figure} dans tout mon document LaTeX, mais le style par défaut est laid; à savoir, les chiffres sont tous alignés à gauche. Est-il possible de redéfinir l'environnement « figure » de sorte qu'il insère automatiquement des commandes de centrage, comme comme celui-ci ?:Modification d'un environnement LaTeX

\begin{figure} \begin{center} 
\end{center} \end{figure} 

Bien sûr, je pourrais utiliser \newenvironment pour définir un environnement « cfigure », mais c'est indésirable. Je ne veux pas passer à travers et changer toutes mes "figures" en "cfigures" (et puis réaliser plus tard que je voulais que toutes les figures soient alignées à droite et doivent les renommer toutes en "figures").

je pourrais utiliser \renewenvironment, mais alors je devrais creuser à travers la source LaTeX pour trouver ce que la « figure » environnement a été défini comme copier/coller dans.

Je presque trouvé ce que je voulu à this blog post, mais l'exemple était pour une commande, pas un environnement.

Répondre

15
\let\oldfigure\figure 
\def\figure{\oldfigure\centering} 

Une autre solution qui fonctionne avec les arguments facultatifs.

Fixé.

\let\oldfigure\figure 
\let\oldendfigure\endfigure 
\def\figure{\begingroup \oldfigure} 
\def\endfigure{\centering \oldendfigure \endgroup} 

fixe 2. Il ne fonctionne avec toutes les options et toutes les règles et \par à l'intérieur.

\makeatletter 
\let\oldfigure\figure 
\def\figure{\@ifnextchar[\[email protected] \[email protected]} 
\def\[email protected][#1]{\oldfigure[#1]\centering} 
\def\[email protected]{\oldfigure\centering} 
\makeatother 
+2

Cela ne marche pas, car figure prend un argument optionnel (comme [htbp] qui sera brisé par cette redéfinition.) –

+1

Ummm ... Je vais repenser –

+1

Hmmm, avez-vous testé votre nouvelle solution?Ça ne semble pas marcher pour moi. –

5

Comme indiqué dans une autre réponse, vous ne pouvez pas faire le vieux truc de commandes à préfixer la fin de la \figure macro parce que gâchera le traitement de l'argument optionnel.

Si un environnement n'a pas d'arguments, alors il fonctionnera correctement, mais sinon il n'y a pas de moyen simple de le faire.

Pour votre problème avec les chiffres, essayez de charger le paquet floatrow:

\usepackage{floatrow} 

Si centrera le contenu de vos chiffres automatiquement.

Mise à jour: Si vous ne voulez pas charger un paquet, voici un code qui le fera aussi. Notez qu'il est spécifique à l'environnement figure, mais le thème de base est: copier la définition d'origine, analyser les arguments de la même manière, puis ajouter le code dont vous avez besoin à la fin.

 
\makeatletter 
\renewenvironment{figure}[1][\[email protected]]{ 
    \edef\@tempa{\noexpand\@float{figure}[#1]} 
    \@tempa\centering 
}{ 
    \[email protected] 
} 
\makeatother 

Le \edef est nécessaire d'étendre complètement \[email protected] avant qu'il ne soit transmis à la \@float macro.

+0

J'ai demandé une solution qui n'implique pas de copier la définition, mais j'ai quand même essayé et j'ai obtenu une commande non définie "\ fps". – exclipy

+0

J'ai expliqué pourquoi il est impossible de le faire (dans ce cas) sans copier la définition. Vous devez ajouter '\ makeatletter' ...' \ makeatother' autour du code (j'ai ajouté ceci à mon exemple) lorsque vous (re) définissez des commandes contenant '@'. –

2

Que diriez-vous:

\newenvironment{centeredfigure}{\begin{figure}\begin{center}}{\end{center}\end{figure}} 

Note: non testé.

+3

Il n'y a rien de mal à cette approche mais vous devriez utiliser '\ centering' au lieu de l'environnement' center', car ce dernier ajoute un remplissage vertical supplémentaire qui n'est pas nécessaire. –

+0

bon point. J'ai essayé d'éviter cela moi-même. Merci! – Martijn

+3

Comme je l'ai dit dans ma question, je ne veux pas le redéfinir sous un autre nom. – exclipy