2009-10-14 25 views
17

Sto usando \begin{figure} ... \end{figure} in tutto il mio documento LaTeX, ma lo stile predefinito è brutto; vale a dire, le figure sono tutte allineate a sinistra. C'è un modo per ridefinire l'ambiente "figure" quindi inserisce automaticamente alcuni comandi di centraggio come simili ?:Fare una piccola modifica ad un ambiente LaTeX

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

Certo, ho potuto utilizzare \newenvironment per definire un ambiente "CFigure", ma che è indesiderabile. Non voglio passare e cambiare tutte le mie "figure" in "cfigures" (e poi realizzo che volevo che tutte le figure fossero allineate a destra e dovessero rinominarle tutte in "rfigures").

potrei usare \renewenvironment, ma poi avrei dovuto scavare attraverso la sorgente LaTeX per trovare ciò che l'ambiente "figura" è stato originariamente definito come copia/incolla in.

ho quasi trovato quello che voluto a this blog post, ma l'esempio era per un comando, non un ambiente.

risposta

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

Un'altra soluzione che funziona con gli argomenti opzionali.

Risolto.

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

fisso 2. Esso funziona bene con tutte le opzioni e le eventuali regole e \par all'interno.

\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

Questo non funziona, perché la figura prende un argomento opzionale (come [htbp] che sarà rotto da questa ridefinizione. –

+1

Ummm ... Giusto. Io ripensare –

+1

Hmmm, hai testato la nuova soluzione?Non sembra funzionare per me. –

5

Come osservato in un'altra risposta, non si può fare il vecchio trucco di comandi Anteporre alla fine del \figure macro perché questo rovinare il trattamento argomento opzionale.

Se un ambiente non ha argomenti, funzionerà correttamente, ma in caso contrario non esiste un modo semplice per farlo.

per il vostro problema con i dati, provare a caricare il pacchetto floatrow:

\usepackage{floatrow} 

Se centrerà il contenuto dei dati automaticamente.

Aggiornamento: Se non si desidera caricare un pacchetto, ecco un codice che lo farà anche. Si noti che è specifico per l'ambiente figure, ma il tema di base è: copiare la definizione originale, analizzare gli argomenti allo stesso modo, quindi aggiungere il codice necessario alla fine.

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

Il \edef è necessaria per espandere pienamente \[email protected] prima che sia passato alla \@float macro.

+0

Ho chiesto una soluzione che non implichi la copia della definizione, ma l'ho comunque provata e ho ottenuto un comando non definito "\ fps". – exclipy

+0

Ho spiegato perché è impossibile farlo (in questo caso) senza copiare la definizione. È necessario aggiungere '\ makeatletter' ...' \ makeatother' attorno al codice (ho aggiunto questo al mio esempio) quando (ri) definisco i comandi contenenti '@'. –

2

ne dite:

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

Nota: non testati.

+3

Non c'è niente di sbagliato in questo approccio, ma dovresti usare '\ centering' invece dell'ambiente' center', perché quest'ultimo aggiunge un riempimento verticale aggiuntivo che non è necessario. –

+0

buon punto. Ho cercato di evitarlo da solo. Grazie! – Martijn

+3

Come ho detto nella mia domanda, non voglio ridefinirlo con un altro nome. – exclipy

Problemi correlati