2009-12-09 16 views
18

Jak zawinąć komendę LaTeX w środowisku? W zasadzie, jak mogę zmienić \ somecommand {contents} w \ begin {somecommand} content \ end {somecommand}? Próbowałem oczywiste w tworzeniu nowego środowiska, takich jak:zawiń komendę LaTeX w środowisku

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

ale to powoduje problemy z nawiasów. Pozwolę sobie podać bardziej konkretny przykład. Powiedzmy, że chcesz stworzyć środowisko bardzo ważne i chcesz użyć polecenia emph, aby to osiągnąć. Proste (ale niepoprawne) rozwiązaniem byłoby napisać coś jak

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

tu problem jest to, że prace komendę z informacją, że znajduje się wewnątrz środowiska, więc to nie jest jednym z początkowych poleceń środowiska , ani nie jest końcową komendą środowiska. Pytanie brzmi: jak to zrobić?

+0

Zadaj nowe pytanie o swój colorbox, mówię ci najlepsze rozwiązanie bez dwukrotnego czytania argumentów. –

Odpowiedz

10

Wygląda na to, że teraz mogę zgadnąć, jakie jest pytanie.

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

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

To rozwiązanie działa dobrze. Ale IMHO to zły pomysł, aby zawinąć cały tekst w środowisku. Czemu? Istnieją dwa sposoby zrobienia czegoś z tekstem. Na przykład chcesz zmienić czcionkę i użyć kursywy.

  • Pierwsza metoda. \textit{sentence written in italics}
  • Druga metoda. {\it sentence written in italics\/}

Jaka jest różnica? Chodzi o to, że pierwsza metoda wykorzystuje drugą. \it makro zmienia czcionkę i klamrę } zmienia ją z powrotem. \textit makro odczytuje pełną argumentację, zmienia czcionkę i ponownie wstawia argument: \textit jest zdefiniowany z grubsza następująco (niezupełnie).

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

Pierwsza metoda zawsze wykonuje dodatkową pracę. Odczytuje argument dwukrotnie. Prawie zawsze można wprowadzać zmiany, a następnie wszystko można cofnąć.

W końcu, dlaczego korzystasz z otoczenia? Użyj makr.

\veryimportant{ 
    Any thought 
} 
+0

Dziękuję za to rozwiązanie! Właściwie nie potrzebuję środowiska dla czegoś tak trywialnego, jak podkreślanie tekstu. Głównym powodem podania tego przykładu jest to, że większość ludzi to zrozumie, sprawiając, że pytanie i odpowiedź będą miały zastosowanie do wielu osób. Moim osobistym celem jest osadzenie zestawu kolorów i pewne wyrównanie w nowym środowisku. Ponieważ colorbox to polecenie, nie wiedziałem, jak to zrobić. Niemniej jednak, dla mojego użytkowania, bardziej sensowne jest korzystanie z otoczenia, nie tylko dlatego, że zapobiega bałaganie i ulewom nawiasów klamrowych, co sprawia, że ​​edycja na późniejszym etapie jest dość trudna. Dzięki! – kvaruni

-1

Nowe środowisko somecommand definiuje makro \somecommand. Nie można użyć makra o tej samej nazwie, co \somecommand w środku.

Ponadto należy napisać

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

zamiast

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

Najwyraźniej problem z zamykaniem.

+0

Powtórzyłeś mój problem, więc zmodyfikowałem moje oryginalne pytanie, aby lepiej wyjaśnić problem, który mam. Mam nadzieję, że to wyjaśni! Dzięki i tak! – kvaruni

19

Można to zrobić za pomocą pakietu environ następująco:

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

\BODY zawiera korpus otoczenia i środowisko może być zagnieżdżone. Więcej informacji można znaleźć w dokumentacji.

+0

Dziękuję, chociaż inne rozwiązanie działa, proponowane rozwiązanie jest z pewnością prostsze! – kvaruni

1

polecenie definiowania

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

zmieni

\eqn{x^2=y} 

do

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

myślę

3

prostszy sposób mogą być:

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

Objaśnienie: \bgroup działa jak { i \egroup działa jak }.

+2

nie działa ze wszystkimi poleceniami, np. '\ fbox' – Hotschke