2009-12-09 5 views
18

Come è possibile eseguire il wrapping di un comando LaTeX in un ambiente? In sostanza, come posso trasformare \ somecommand {contents} in \ begin {somecommand} contents \ end {somecommand}? Ho provato l'ovvio nella creazione di un nuovo ambiente in quanto tale:avvolgere il comando LaTeX nell'ambiente

\newenvironment{somecommand}[0]{ 
    \somecommand{ 
} 
{ 
    } 
} 

ma questo causa problemi con le parentesi graffe. Lasciatemi fare un esempio più concreto. Supponiamo che tu voglia creare l'ambiente molto importante e che tu voglia usare il comando emph per farlo. Una soluzione semplice (ma non corretto) sarebbe quello di scrivere qualcosa come

\newenvironment{very-important}[0]{ 
    \emph{ 
} 
{ 
    } 
} 

Il problema qui è che il comando opere con le informazioni che si trova all'interno dell'ambiente, quindi non è uno dei comandi dell'ambiente di apertura , né è un comando di chiusura dell'ambiente. La domanda è quindi: come puoi fare questo?

+0

Fai una nuova domanda sulla tua casella dei colori, ti dico la soluzione migliore senza leggere gli argomenti due volte. –

risposta

10

Sembra che ora posso indovinare qual è la domanda.

\newenvironment{very-important}{\startimportant}{} 
\def\startimportant#1\end{\emph{#1}\end} 

\begin{very-important} 
Something 
\end{very-important} 

Questa soluzione funziona bene. Ma IMHO è una cattiva idea avvolgere tutto il testo nell'ambiente. Perché? Ci sono due modi per fare qualcosa con il testo. Ad esempio, si desidera modificare il carattere e utilizzare il corsivo.

  • Il primo metodo. \textit{sentence written in italics}
  • Il secondo metodo. {\it sentence written in italics\/}

Qual è la differenza? Il fatto è che il primo metodo usa il secondo. \it la macro cambia il carattere e la parentesi graffa } la modifica. \textit la macro legge l'argomento completo, cambia il carattere e inserisce nuovamente l'argomento: \textit viene definito approssimativamente come segue (non esattamente).

\def\texit#1{{\it#1\/}} 

Il primo metodo è sempre un lavoro extra. Legge l'argomento due volte. Quasi sempre, è possibile apportare modifiche e quindi si può tornare tutto.

Eventualmente perché usi l'ambiente? Usa macro.

\veryimportant{ 
    Any thought 
} 
+0

Grazie per questa soluzione! In realtà, non ho bisogno dell'ambiente per qualcosa di così banale come enfatizzare il testo. La ragione principale per fornire questo esempio è perché la maggior parte delle persone capirà questo, rendendo la domanda e la risposta applicabili a molti. Il mio uso personale è quello di incorporare un colorbox e qualche allineamento in un nuovo ambiente. Poiché colorbox è un comando, non sapevo come farlo. Tuttavia, per il mio utilizzo ha più senso usare un ambiente, non ultimo perché impedisce il disordine e un acquazzone di parentesi graffe che rende piuttosto difficile il montaggio in una fase successiva. Grazie! – kvaruni

-1

Nuovo ambiente somecommand definisce la macro \somecommand. All'interno non è possibile utilizzare la macro con lo stesso nome \somecommand.

Inoltre si dovrebbe scrivere

\newenvironment{name}{openning command}{closing commands} 

piuttosto che

\newenvironment{somecommand}[0]{ \somecommand{ } { } } 

È, ovviamente, ha un problema con i comandi di chiusura.

+0

Hai reiterato il mio problema, quindi ho modificato la mia domanda iniziale per spiegare meglio il problema che sto avendo. Spero che questo lo chiarisca! Grazie comunque! – kvaruni

19

Questo può essere fatto con il pacchetto environ come segue:

 
\usepackage{environ} 
... 
\NewEnviron{very-important}{\emph{\BODY}} 

\BODY contiene il corpo dell 'ambiente, e gli ambienti possono essere annidate. Vedi la documentazione per maggiori dettagli.

+0

Grazie, anche se l'altra soluzione funziona, la soluzione che proponi è sicuramente più semplice! – kvaruni

1

definiscono comando

\newcommnad{eqn}{1}{\begin{equation}#1\end{equation}} 

cambierà

\eqn{x^2=y} 

a

\begin{equation} 
    x^2=y 
\end{equation} 

Penso

3

un modo più semplice potrebbe essere:

\newenvironment{somecommand}[0]{ \somecommand\bgroup } { \egroup }

Spiegazione: \bgroup opere come { e \egroup opere come }.

+2

non funziona con tutti i comandi, ad es. '\ Fbox' – Hotschke

Problemi correlati