Unterdrücken formaler Argumente innerhalb \newcommand

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Rolli
Forum-Guru
Forum-Guru
Beiträge: 345
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Unterdrücken formaler Argumente innerhalb \newcommand

Beitrag von Rolli »

Hallo,

ich möchte mir ein Kommando basteln, welches eine Reihe von Einstellungen nach meinem Geschmack ändert. Dabei sind u.a. auch Dinge wie bsp. \emph, welches ja ein Argument hat. Mein untenstehendes Minimalbeispiel erzeugt natürlich einen Fehler beim Übersetzen, weil das formale Argument #1 für \myStandards nicht definiert ist.

Gibt es eine Möglichkeit, beim \renewcommand\emph das formale Argument #1 am Parser so vorbei zu schleusen, dass dieser es nicht expandiert, sondern als #1 an \emph weiter gibt?

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage[fleqn]{amsmath}

\newcommand {\myStandards}
{
   \setlength{\mathindent} {1cm}
   \setlength{\itemsep}    {0pt}
   % ... und einiges Weiteres
   \renewcommand\emph[1]{{\color{blue}\textit{\textbf{#1}}}}
}   
\begin{document}
   Blablabla
\end{document}
Gruß vom Rolli

Gast

Beitrag von Gast »

Wenn ich die etwas umständlich formulierte Frage richtig verstehe, willst du wissen, wie man innerhalb von Befehlen, Befehle mit Argument definieren oder umdefinieren kann.

Bei der Definition von Befehlen innerhalb von Befehlen muss man die Anzahl der # bei jeder Schachtelungstiefe verdoppeln.

Rolli
Forum-Guru
Forum-Guru
Beiträge: 345
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Danke für den schnellen Tipp, Gast.
Wie kann ich meine Frage einfacher formulieren?

Das mit dem ## kannte ich nicht. Also:

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage[fleqn]{amsmath}

\newcommand {\myStandards}
{
   \setlength{\mathindent} {1cm}
   \setlength{\itemsep}    {0pt}
   % ... und einiges Weiteres
   \renewcommand\emph[1]{{\color{blue}\textit{\textbf{##1}}}}
}
%\renewcommand\emph[1]{{\color{blue}\textit{\textbf{#1}}}}
\begin{document}
   Blablabla
   \emph{Blablabla}
\end{document}
Das übersetzt zwar ohne Fehler, tut aber nicht das Gewünschte - es ist lediglich kursiv, jedoch nicht fett und nicht blau.
Auskommentieren des \renewcommand\emph... außerhalb meines \myStandard hingegen funktioniert wie beabsichtigt.

???

Gruß vom Rolli

Gast

Beitrag von Gast »

Naja, so wie Du es jetzt definierst und nutzt, würde \myStandards den Befehl \emph umdefinieren, wenn \myStandards selbst aufgerufen wird.

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage[fleqn]{amsmath}

\newcommand {\myStandards}
{
   \setlength{\mathindent} {1cm}
   \setlength{\itemsep}    {0pt}
   % ... und einiges Weiteres
   \renewcommand\emph[1]{{\color{blue}\textit{\textbf{##1}}}}
}

\begin{document}
   Blablabla
   \emph{Blablabla}

\myStandards

   Blablabla
   \emph{Blablabla}
\end{document}
Solange das noch nicht passiert ist, wird auch an \emph nicht geschraubt.

TeX ist ja eine Makro-Expansions-Sprache. Die Effekte von Code passieren erst, wenn er (im richtigen Kontext) ausgeführt wird, in der Definition mit \newcommand wir kein Code ausgeführt, Du teilst LaTeX damit nur mit, dass jedes Vorkommen von \myStandards durch den Definitionscode ersetzt wird.

Rolli
Forum-Guru
Forum-Guru
Beiträge: 345
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

...
Wald und Bäume ...
vollkommen klar. Manche Dinge sind halt viel einfacher, als gedacht.
DANKE!
Gruß vom Rolli

Antworten