2 Zeichen basteln: \cdot mit Abstand und Zeichenüberlagerung

Formelsatz für Mathematik, Naturwissenschaften und Technik


guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

2 Zeichen basteln: \cdot mit Abstand und Zeichenüberlagerung

Beitrag von guy.brush™ »

Hallo,

ich möchte mir aktuell zwei Symbole/Zeichen erstellen. Damit ist nicht ein komplett neues Symbol gemeint, sondern folgendes:

Problem 1:

In der Mathematik wird ja häufiger ein Punkt (\cdot) verwendet, der als Platzhalter Verwendung findet. Kurze Beispiele:
|\cdot| = ...
f(\cdot) = ...
P(\cdot \mid B) = ...
Jetzt habe ich aber folgendes Problem, wenn ich es nur wie in dem Beispiel löse: Bei den ersten 2 Fällen gibt es so gut wie keinen Abstand zu den Klammern bzw. Betragsstrichen. Im 3. Fall jedoch ist nur die linke runde Klammer nah am \cdot, zum \mid-Strich hat mein \cdot jedoch mehr Abstand, da \mid als binärer Operator ja schon einen Abstand mitbringt. Ich hätte gerne nun folgendes:

Ich würde mir gerne einen neuen \cdot mit Abstand links und rechts definieren. Dieser Abstand soll gleich dem Abstand eines binären Operators sein, also wie er z.B. bei \mid automatisch einfügt wird, wenn links und rechts Variablen davon stehen würden (wie viel ist das eigentlich? \, oder \: oder \;?). Dieser Abstand soll jedoch nur eingefügt werden, wenn auf der Seite nicht schon dieser Abstand durch einen binären Operator, wie z.B. \mid, eingefügt wird. Sonst würde ich auf dieser Seite ja einen doppelt so großen Abstand erhalten.

Das Ergebnis sollte dann in jedem erdenklichen Fall so aussehen, dass der Abstand links und rechts vom \cdot gleich groß ist. Auch soll der Abstand auf beiden Seiten gleich groß sein, egal ob auf der einen Seite ein binärer Operator steht und auf der anderen Seite nicht. (Der geringe Platz, der im obigen Beispiel z.B. zur Klammer oder zum Betragsstrich vorhanden ist, ist mir aber definitiv zu wenig :).)

Kurzum: Ich möchte mir diesen fehlenden Platzhalter definieren :).


Problem 2:

Ich möchte gerne die align-Umgebung anstelle einer array-Umgebung verwenden. Die align-Umgebung richtet beim & jedoch stets nach dem linken Rand des Zeichens/Symbols sich aus. Für den Fall, dass ich ein \vdots verwende, ist dies jedoch etwas unpraktisch und ich muss das ganze manuell so pi mal Daumen mittig hinschieben.

Meine Lösungsidee hierfür: Ich würde gerne jeweils zwei Zeichen überlagern und nur eines davon sichtbar ausgeben. So möchte ich z.B. ein Gleichheitszeichen = und die \vdots überlagern, so dass die \vdots zentriert auf dem = liegen. Dann richtet sich die align-Umgebung weiterhin nach dem = aus, die \vdots sind mittig und das = sieht man aber trotzdem nicht. (Je nachdem, an welchem Symbol man gerade ausrichtet, muss man natürlich andere Symbole überlagern, kann ja auch sein, dass die \vdots z.B. unter \Leftrightarrow's stehen.)

Dies ist vielleicht nicht die beste Lösung, also bin ich hier auch für andere Vorschläge offen. Ich möchte nur weiterhin die align-Umgebung verwenden und nicht für diesen Spezialfall auf die array-Umgebung ausweichen müssen.


Viele Grüße,

\\ guy.brush™
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Auch dieses Thema möchte ich pushen :). Wobei ich zugeben muss, dass mir die Geschichte mit dem \cdot wichtiger als das andere Problem ist (also Problem 1 > Problem 2).
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Einen einzelnen Punkt habe ich noch nie als Platzhalter gesehen. Insbesondere der vertikal zentrierte einzelne Punkt ist eher ein Multiplikationszeichen. Als Auslassungs- oder Fortsetzungszeichen werden eher drei auf der Grundlinie platzierte Punkte (\dots) verwendet, die sogenannten ellipsis.

Einer der Gründe, warum Deine Fragen wenig Resonanz finden, könnte übrigens darin liegen, dass Du den goLaTeX-Knigge (zumindest hier) nicht beachtest (siehe meine Signatur).

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Hallo,

vielleicht ist das dann eher hier bei uns an der Uni im Gebrauch. Generell ist bei dieser Verwendung der Malpunkt \cdot inhaltlich äquivalent zu einer Wildcard z.B. in der Suche. Dort wird eben oft ein * verwendet.

Drei Auslassungspunkte, also \dots oder \ldots, haben für mich eine andere Bedeutung. Diese werden bei uns in der Mathematik (zumindest im handschriftlichen Bereich) oft dazu verwendet, um Dinge abzukürzen, weil man sie nicht noch einmal schreiben möchte (oder nicht alle hinschreiben kann, weil man z.B. eine unendliche Summe oder eine Summe bis nach "n" nicht komplett ausschreiben kann).

Dementsprechend ist \cdot eben eher eine Wildcard und \dots ein Auslassungszeichen für etwas bestimmtes.


Den Hinweis auf den goLaTeX-Knigge verstehe ich so, dass du denkst, dass Minimalbeispiele fehlen. Hmm ... ich dachte, es wäre klar, was ich meine bzw. dass ein Minimalbeispiel hier nicht mehr wirklich einen Verständniszuwachs bringen würde.

Dennoch hier ein ausführbares Minimalbeispiel:
\documentclass[a4paper,11pt]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}

\begin{document}

Unterschiedlicher Platz links und rechts von \textbackslash cdot in verschiedenen Situationen (Problem~1):
\begin{gather*}
  |\cdot| = \ldots\\
  f(\cdot) = \ldots\\
  P(\cdot \mid B) = \ldots
\end{gather*}


Manuelle L"osung bei Problem~2:
\begin{align*}
  a_1 &= 1\\
  a_2 &= 2\\
  &\;\:\vdots\\
  a_{42} &= 42.
\end{align*}

Ohne manuelle L"osung bei Problem~2:
\begin{align*}
  a_1 &= 1\\
  a_2 &= 2\\
  &\vdots\\
  a_{42} &= 42.
\end{align*}

\end{document}
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Es ist immer schön, wenn ein Fragesteller entscheidet, ob der Helfer ein vollständiges Minimalbeispiel zu brauchen hat oder nicht. :( Du hast doch selbst gesehen, dass Du ohne Minimalbeispiel keine Hilfe bekommen hast. Wenn jemand keine Hilfe bekommt, sollte er sich als erstes Mal Gedanken machen, wie er seine Chancen verbessern kann. Meist fehlt es an Informationen. Dazu gehört auch das vollständige Minimalbeispiel. Warum soll jeder potentielle Helfer erst einen Testfall bauen, wenn Du das einmalig besser kannst?

Dass Dir eine einfache Antwort nicht genügt, zeigt auch Dein letzter Kommentar. Darin habe ich als einfache Antwort auf das Paket ellipsis verwiesen. In der Anleitung dazu ist auch der Code erklärt. Es ist eigentlich nicht sehr schwer, den Code für drei Grundlinienpunkte auf einen zentrierten Punkt anzuwenden. Aber dieser Hinweis genügt Dir nicht. Du brauchst fertigen Code. Also brauche ich ein vollständiges Minimalbeispiel, an dem ich den Code testen und zeigen kann:
\documentclass[a4paper,11pt]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}% utf8x wird seit Jahren nicht gepflegt und
                           % verursacht mit diversen Paketen Probleme, so dass
                           % man es nur verwenden sollte, wenn utf8 ganz
                           % sicher nicht genügt und man weder xelatex noch
                           % lualatex mit Unicode-Font verwenden kann.
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{ellipsis}
\makeatletter
\newcommand*{\edot}{%
  \ellipsis@before\cdot\ellipsis@after
}
\makeatother

\begin{document}

Unterschiedlicher Platz links und rechts von \textbackslash cdot in verschiedenen Situationen (Problem~1):
\begin{gather*}
  |\cdot| = \ldots\\
  f(\cdot) = \ldots\\
  P(\cdot \mid B) = \ldots
\end{gather*}

Lösung: ellispis mit neuem \verb|\edot|
\begin{gather*}
  |\edot| = \dots\\
  f(\edot) = \dots\\
  P(\edot\mid B) = \dots\\
  P(\edot| B) = \dots
\end{gather*}

\end{document} 
Das zweite Problem ist übrigens ein ganz anders. Hier hättest Du schlicht gerne, dass = und \vdots eine eigene Spalte darstellen innerhalb derer horizontal zentriert wird. Bei align* wird die zweite Spalte aber linksbündig gesetzt. Die LaTeX-Standardumgebung eqnarray macht das:
\begin{eqnarray*}
  a &=& b\\
  c &\vdots& d \\
\end{eqnarray*}
erzeugt aber ein saumäßiges Spacing. Eine weit bessere Lösung bietet das von Dir bereits verwendete Paket mathtools, dessen Anleitung Du vielleicht, sobald Du ein wenig Zeit findest, einmal etwas gründlicher lesen solltest: \vdotswithin und \shortvdotswithin.

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Vielen Dank für das Beispiel :). Aber es scheint noch nicht so richtig zu funktionieren. Die Unterschiede sind beidseitig nicht gleich und bei unterschiedlichen Zeichen links und rechts auch unterschiedlich groß (die Abstände).
\documentclass[a4paper,11pt]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}% utf8x wird seit Jahren nicht gepflegt und
                           % verursacht mit diversen Paketen Probleme, so dass
                           % man es nur verwenden sollte, wenn utf8 ganz
                           % sicher nicht genügt und man weder xelatex noch
                           % lualatex mit Unicode-Font verwenden kann.
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{ellipsis}
\makeatletter
\newcommand*{\edot}{%
  \ellipsis@before\cdot\ellipsis@after
}
\makeatother

\begin{document}

Unterschiedlicher Platz links und rechts von \textbackslash cdot in verschiedenen Situationen (Problem~1):
\begin{gather*}
  |\cdot| = \ldots\\
  f(\cdot) = \ldots\\
  P(\cdot \mid B) = \ldots
\end{gather*}

Lösung: ellispis mit neuem \verb|\edot|
\begin{gather*}
  |\edot| = \dots\\ % <== dieser Abstand wäre beidseitig in allen Fällen wünschenswert
  f(\edot) = \dots\\ % <== zu wenig Abstand im Vergleich zu oben
  P(\edot\mid B) = \dots\\ % <== da \mid ein binärer Operator ist, nach rechts ausreichend Platz, nach links jedoch nicht
  P(\edot| B) = \dots
\end{gather*}

\end{document}
Der Abstand hat sich im Übrigen leider nicht verändert im Vergleich zu dem davor mit \cdot.


Viele Grüße,

\\ guy.brush


PS: Vielen Dank für den Hinweis bzgl. des uft8x. Ich meine gerade, irgendwo gelesen zu haben, dass uft8x das neuere oder komplettere sei und deshalb zu bevorzugen, vermutlich habe ich da entweder eine veraltete oder falsche Quelle gehabt :).

PPS: Hier hat den Malpunkt auch jemand als Wildcard verwendet (bei Definition). Man sieht auch einen ".", das habe ich auch schon einmal gesehen, aber ich mag den zentrierten Punkt lieber.
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Du beachtest nicht, dass unterschiedliche Zeichenklassen und auch unterschiedliche Zeichen unterschiedliche Abstände zu ein und demselben anderen Zeichen haben. Das ist normal und soll so sein. Das ist beim Mathesatz genauso wichtig wie beim Textsatz. Das beginnt damit, dass der Schriftdesigner vor und nach einem Glyphen Leerraum in der Zeichenzelle einfügt, geht über Kerning (primär ebenfalls vom Schriftdesigner vorgegeben) bis zu Abständen, die TeX selbst einfügt (beispielsweise nach einem Komma im Mathesatz). Die alle gleich zu machen, dürfte etwas Arbeit bringen und das Ergebnis nicht wirklich verbessern.

guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Sorry, dass ich jetzt erst schreibe, aber ich wollte das Thema noch abhaken.

Ich hatte noch die Idee, ob vielleicht eine Definition funktionieren könnte, wie sie wohl für \DeclareMathOperator aus mathtools (bzw. \mathop im Allgemeinen) funktionieren könnte, aber dem dürfte so auch nicht sein. Allerdings habe ich hier z.B. auch gemerkt, dass bei etwas wie "\quad \sin" mehr Platz in der Ausgabe vorhanden ist als nur das/der gewünschte \quad - nämlich noch ein kleiner Platz mehr, der von dem Operator eingefügt wird. Als kurzes Beispiel:
\documentclass[ngerman]{scrartcl}
\usepackage{babel}
\usepackage{amsmath}

\begin{document}

\begin{gather*}
  a \quad \mathrm{sin}\\
  a \quad \sin\\
  a \quad \!\sin\\
  a \quad {\sin}
\end{gather*}

\end{document}
Ich hake somit den Wunsch nach einem einem universellem \cdot-Wildcard ab und betrachte dies als "nicht in angemessener Zeit realisierbar". Ich werde mir dann wohl 3-4 Befehle für die jeweiligen Situationen basteln und via {\cdot} den Platz um den Malpunkt herum "zerstören" bzw. aufheben, da mir jetzt kein Befehl für einen Malpunkt bekannt ist, der noch kein binärer Operator ist wie \cdot.


Die Lösung mit \vdotswithin ist jedoch eine sehr zufriedenstellende Lösung! Vielen Dank dafür.


Viele Grüße,

\\ guy.brush
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

Antworten