Latex Command für verschiedene Modi

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


RicardoShillyShally
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Sa 16. Jun 2018, 01:46

Latex Command für verschiedene Modi

Beitrag von RicardoShillyShally »

Hallo,

ich würde gerne einen eigenen Command schreiben, der folgendes können soll:

Durch den \befehl{}{} hier mit zwei Variablen, sollen entweder die Variablen #1 aktiviert werden, die dann alle Zeilen mit #1 zu Beginn ausführen und alle Variablen #2 rauskommentieren. Natürlich soll das ganze auch umgekehrt funktionieren. D.h. wenn #2 aktiviert wird, werden alle Zeilen mit #1 ignoriert.

In den Zeilen stehen später verschiedene Befehle. Kann mir jemand behilflich sein?

Um zum Beispiel #1 zu aktivieren, habe ich folgendes ausprobiert. Funktioniert aber nicht:
\befehl{\ }{%
}

\newcommand{\befehl}[6]
{
#1 Text
#1 \newpage
#1 Text
#2 Test
#2 \newpage
#2 Test
}

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2159
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Als Pseudonym für den Kollegen eines verhaltensauffälligen theoretischen Physikers :wink: bestimmst Du einen Befehl mit sechs Argumenten und verwendest aber nur zwei davon.

Aber wie wählst Du aus, welches Argument aktiviert werden soll?

Eine Möglichkeit mit einem dritten Argument für die Auswahl könnte so aussehen:

Code: Alles auswählen

\documentclass[preview]{standalone}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\befehl{ m m m }
{
    \str_case:nn { #3 }
    {
        { Text } 
        {
            #1\ Text\
            #1 \newpage
            #1\ Text
        }
        { Test } 
        { 
            #2\ Test\
            #2 \newpage
            #2\ Test
        }
    }
}
\ExplSyntaxOff

\begin{document}
\befehl{erstes Argument}{zweites Argument}{Text}\par
\befehl{erstes Argument}{zweites Argument}{Test}
\end{document}
Eine andere Möglichkeit wäre, mit dem Befehl \ifstrequal des Pakets etoolbox zu arbeiten.

RicardoShillyShally
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Sa 16. Jun 2018, 01:46

Beitrag von RicardoShillyShally »

Danke, das hilft schon weiter. Leider bekomme ich noch eine Fehlermeldung, wenn ich versuche z.B. durch A oder B die Bildbeschriftung entweder auf Abbildung oder Figure zu ändern. Wahrscheinlich, weil der \renewcommand nicht nach \begin{dokument} auftauchen darf. Gibt es aber eine Möglichkeit, das irgendwie zu lösen, wie ich das vorhabe? Leider kann ich den \befehl{}{}{B} auch nicht vor \begin{dokument} setzen...

Ich weiß, dass man das auch mit den Spracheinstellungen schaffen kann, was ich vorhabe. Ich würde aber gerne wissen, ob man mit einem solchen Makro generell vor dem \begin{dokument} durch Parameter gewisse Einstellungsmöglichkeiten aktivieren und deaktivieren kann.


\documentclass[preview]{standalone}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\befehl{ m m m }
{
\str_case:nn { #3 }
{
{A}
{
\renewcommand{\thefigure}{\arabic{Abbildung}}
}
{B}
{
\renewcommand{\thefigure}{\arabic{Figure}}
}
}
}
\ExplSyntaxOff


\begin{document}
\befehl{}{}{B}
\end{document}

rais
Forum-Guru
Forum-Guru
Beiträge: 392
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

RicardoShillyShally hat geschrieben:Leider bekomme ich noch eine Fehlermeldung, wenn ich versuche z.B. durch A oder B die Bildbeschriftung entweder auf Abbildung oder Figure zu ändern. Wahrscheinlich, weil der \renewcommand nicht nach \begin{dokument} auftauchen darf.
nö, \renewcommand darf auch nach \begin{document} auftauchen.
Das, was Du da umzudefinieren versuchst (\thefigure), gibt normalerweise nur den Zähler selbst (ggf. mit vorgestelltem, übergeordnetem Zähler) aus und \arabic erwartet einen Zählernamen (in Deinem fall `figure'), anders ausgedrückt willst Du `\thefigure' gar nicht ändern, vermutlich eher `\figurename'.

Das Aktivieren könnte auch einfach ein Schalter machen, in etwa

Code: Alles auswählen

%Präambel
\newif\ifonlysecond
\onlysecondtrue

%in Deinem \befehl z.B.
\ifonlysecond#2\else#1\fi
VG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

Gast

Beitrag von Gast »

Wenn die Umschaltung mehrere Befehle betreffen soll und die Umschaltung nur einmal in der Präambel stattfinden soll, würde ich das dort direkt machen, also beispielsweise:

Code: Alles auswählen

\documentclass{article}
\newif\ifvarianteA
\varianteAtrue
%\varianteAfalse
\ifvarianteA
  \newcommand*{\TestA}{A}
  \newcommand*{\testA}{a}
\else
  \newcommand*{\TestA}{B}
  \newcommand*{\testA}{b}
\fi
\begin{document}
Variante \TestA{} mit \textA.
\end{document}
Wenn es dagegen im Dokument mehrfach umgeschaltet werden soll oder sogar mehr als zwei Varianten geben soll, würde ich das eher so machen:

Code: Alles auswählen

\documentclass{article}
\newcommand*{\TestA}{A}
\newcommand*{\testA}{a}
\newcommand*{\TestB}{B}
\newcommand*{\testB}{b}
\newcommand*{\TestC}{C}
\newcommand*{\testC}{c}
\newcommand*{\Test}{unknown}
\newcommand*{\test}{unknown}
\newcommand*{\Variante}[1]{%
  \def\Test{\csname Test#1\endcsname}%
  \def\test{\csname test#1\endcsname}%
}
\begin{document}
\Variante{A}Test \Test{} mit \test{}.
\Variante{B}Test \Test{} mit \test{}.
\Variante{C}Test \Test{} mit \test{}.
\end{document}
oder wie bei \captions<Sprache>:

Code: Alles auswählen

\documentclass{article}
\newcommand*{\VarianteA}{%
  \def\Test{A}%
  \def\test{a}%
}
\newcommand*{\VarianteB}{%
  \def\Test{B}%
  \def\test{b}%
}
\newcommand*{\VarianteC}{%
  \def\Test{C}%
  \def\test{c}%
}
\newcommand*{\Test}{unknown}
\newcommand*{\test}{unknown}
\makeatletter
\newcommand*{\Variante}[1]{%
  \@nameuse{Variante#1}%
}
\makeatother
\begin{document}
\Variante{A}Test \Test{} mit \test{}.
\Variante{B}Test \Test{} mit \test{}.
\Variante{C}Test \Test{} mit \test{}.
\end{document}
Es hängt also etwas davon ab, wie das ganze dann tatsächlich angewendet werden soll.

RicardoShillyShally
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Sa 16. Jun 2018, 01:46

Beitrag von RicardoShillyShally »

Danke für die Beispiele. Es klappt nun.

rais hat recht. Ich wollte eigentlich die \figurename ändern. Es funktioniert jetzt auch mit \renewcommand nach \begin{dokument}.

Könnte man so einen Switch auch für verschiedene \usepackage{} schreiben?

LG

rais
Forum-Guru
Forum-Guru
Beiträge: 392
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

RicardoShillyShally hat geschrieben: Könnte man so einen Switch auch für verschiedene \usepackage{} schreiben?
Vermutlich ja.

Da außer Dir hier niemand wissen kann, um welche Pakete es Dir geht, und was konkret Du eigentlich verändern willst, ist eine `bessere' Antwort kaum möglich...

VG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

Gast

Beitrag von Gast »

RicardoShillyShally hat geschrieben:Ich wollte eigentlich die \figurename ändern.
Wenn du das abhängig von der verwendeten Sprache ändern willst, dann schau in die [d]babel[/d]-Anleitung. Da ist erklärt, wie man die sprachabhängigen Begriffe ändert. Alternativ kann man das auch unabhängig von babel mit KOMA-Script machen, wenn man eine KOMA-Script-Klasse verwendet.

Wenn du hingegen abhängig davon ändern willst, wofür die figure-Umgebung tatsächlich verwendet wird, dann sei darauf hingewiesen, dass man auch weitere Gleitumgebungen definieren kann. Siehe dazu beispielsweise das tocbasic-Kapitel in der KOMA-Script-Anleitung oder die Anleitung zum Paket caption.

Es ist übrigens kontraproduktiv die Helfer hier Rätselraten spielen zu lassen. Es viel zielführender, das eigentliche Problem zu schildern und ein Minimalbeispiel dafür anzugeben.

Antworten