Font ins listings und mathmode Thema ist als GELÖST markiert

Schriftbild, Absätze und Auflistungen einstellen


GuenterW.

Font ins listings und mathmode

Beitrag von GuenterW. »

Hallo!

Hier ein Minimalbeispiel:
\documentclass[a4paper]{scrbook} 
\usepackage{listings}
\usepackage{xcolor}
\usepackage{amsmath,amssymb,amsthm}
\lstset{
basicstyle=\ttfamily,
numbers=left,
showstringspaces=false,
language=Haskell,
commentstyle=\itshape\color{darkgray},
keywordstyle=\bfseries\color{red},
stringstyle=\color{green},
backgroundcolor=\color{white},
breaklines=true,
breakautoindent=true,
columns=flexible,
frame=single,
captionpos=b,
xleftmargin=3em,
xrightmargin=1em,
aboveskip=10pt
}
\begin{document} 
\begin{lstlisting}[title={Program P},label=P,mathescape=true]
f(a,b) = if b = 1 then a else 1:g(a,b-1,a)
g(c,d,e) = if d = 1 then e$\cdot$c else 2:g(c,d-1,e$\cdot$c)
\end{lstlisting}

\begin{equation}
f(x,y) = \underbrace{x \cdot y}_{\text{body}}
\end{equation}


\end{document}
Mein Problem:
Ich hätte gerne, dass der Text im Listing im gleichen Font dargestellt wird wie die Formel, bzw. lieber andersherum. Wie geht das? :-)

Danke,
Guenter

GuenterW.

Beitrag von GuenterW. »

Hallo,

war mein Anliegen nicht verständlich? Im Prinzip möchte ich eine Zeile des Listings nehmen und diese mit Hilfe von under und overbrace erklären, so wie ich es in der Matheumgebung machen kann. Allerdings soll dabei die Zeile, die ich erkläre, möglichst genau so aussehen wie im listing, d.h. gleicher Font und am besten auch hervorgehobene Wörter.

Wäre toll, wenn ihr mir dabei doch noch helfen könntet!
Guenter

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Grafischer Ansatz

Beitrag von localghost »

Da gefällt dir vielleicht ein Ansatz mit pgf/tikZ.
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,matrix}

\colorlet{bgcolor}{white}    % Farbe für background
\colorlet{ccolor}{darkgray}  % Farbe für comments
\colorlet{kwcolor}{red}      % Farbe für keywords
\colorlet{scolor}{green}     % Farbe für strings

\lstset{
  language=Haskell,
  basicstyle=\ttfamily,
  numbers=left,
  showstringspaces=false,
  commentstyle=\itshape\color{ccolor},
  keywordstyle=\bfseries\color{kwcolor},
  stringstyle=\color{scolor},
  backgroundcolor=\color{bgcolor},
  breaklines=true,
  breakautoindent=true,
  columns=flexible,
  frame=single,
  captionpos=b,
  xleftmargin=3em,
  xrightmargin=1em,
  aboveskip=10pt
}

\begin{document}
\begin{lstlisting}[title={Program P},label=P,mathescape=true]
f(a,b) = if b = 1 then a else 1:g(a,b-1,a)
g(c,d,e) = if d = 1 then e$\cdot$c else 2:g(c,d-1,e$\cdot$c)
\end{lstlisting}

\begin{tikzpicture}
  \matrix (lstline) [%
    matrix of nodes,
    nodes={anchor=base,font=\ttfamily}
  ] {
    f(a,b) & = & |[kwcolor]|if & b & = & 1 & |[kwcolor]|then & a & |[kwcolor]|else & 1:g(a,b-1,a) \\
  };
  \draw[decorate,decoration=brace] (lstline-1-3.south east) -- (lstline-1-3.south west) node[below,pos=0.5,font=\scriptsize] {keyword};
  \draw[decorate,decoration=brace] (lstline-1-7.north west) -- (lstline-1-7.north east) node[above,pos=0.5,font=\scriptsize] {keyword};
\end{tikzpicture}
\end{document}
In der Anleitung findest Du alles weitere.


Thorsten
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

GuenterW.

Beitrag von GuenterW. »

Hallo Thorsten!

Vielen Dank schon einmal dafür! Mit dem Ansatz habe ich noch ein Problem. Und zwar möchte ich ja die geschweifte Klammer für "parameters" nur unter a,b haben und nicht unter f(a,b). Wenn ich nun aber einen extra Knoten für a,b einfüge, gibt es Abstände zwischen a,b und den beiden Klammern. Ich weiß jetzt leider nicht, wie ich für diesen Fall die notedistance irgendwie anpassen kann.

Auch habe ich leider lstline nicht im tikz manual gefunden, denke aber ich habe die Syntax einigermaßen verstanden :-)

Gruß,
Guenter

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Steuerung der Positionierung

Beitrag von localghost »

GuenterW. hat geschrieben:[…] Und zwar möchte ich ja die geschweifte Klammer für "parameters" nur unter a,b haben und nicht unter f(a,b). Wenn ich nun aber einen extra Knoten für a,b einfüge, gibt es Abstände zwischen a,b und den beiden Klammern. Ich weiß jetzt leider nicht, wie ich für diesen Fall die notedistance irgendwie anpassen kann. […]
Du musst keinen zusätzlichen Knoten anlegen. Mit Hilfe der Bibliothek »calc« (siehe Anleitung) kannst Du die Anfangs- und End-Position der Klammer relativ bequem festlegen (siehe Code unten).
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathreplacing,matrix}

\colorlet{bgcolor}{white}    % Farbe für background
\colorlet{ccolor}{darkgray}  % Farbe für comments
\colorlet{kwcolor}{red}      % Farbe für keywords
\colorlet{scolor}{green}     % Farbe für strings

\lstset{
  basicstyle=\ttfamily,
  numbers=left,
  showstringspaces=false,
  language=Haskell,
  commentstyle=\itshape\color{ccolor},
  keywordstyle=\bfseries\color{kwcolor},
  stringstyle=\color{scolor},
  backgroundcolor=\color{bgcolor},
  breaklines=true,
  breakautoindent=true,
  columns=flexible,
  frame=single,
  captionpos=b,
  xleftmargin=3em,
  xrightmargin=1em,
  aboveskip=10pt
}

\begin{document}
\begin{lstlisting}[title={Program P},label=P,mathescape=true]
f(a,b) = if b = 1 then a else 1:g(a,b-1,a)
g(c,d,e) = if d = 1 then e$\cdot$c else 2:g(c,d-1,e$\cdot$c)
\end{lstlisting}

\begin{tikzpicture}[decoration=brace]
  \matrix (lstline) [%
    matrix of nodes,
    nodes={anchor=base,font=\ttfamily}
  ] {
    f(a,b) & = & |[kwcolor]|if & b & = & 1 & |[kwcolor]|then & a & |[kwcolor]|else & 1:g(a,b-1,a) \\
  };
  \draw[decorate] ($(lstline-1-1.south east)+(-0.9em,0.5ex)$) -- ($(lstline-1-1.south west)+(1.4em,0.5ex)$) node[below,pos=0.5,font=\scriptsize] {parameters};
\end{tikzpicture}
\end{document}
GuenterW. hat geschrieben:[…] Auch habe ich leider lstline nicht im tikz manual gefunden, denke aber ich habe die Syntax einigermaßen verstanden […]
Da hast Du etwas missverstanden. Die Bezeichnung »lstline« habe ich der Matrix zugewiesen, um die einzelnen Knoten direkt verwenden zu können. Sie ist kein fester Begriff und daher so auch nicht in der Anleitung zu finden. Suche in der Anleitung nach der Bibliothek »matrix«.
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

GuenterW.

Beitrag von GuenterW. »

Hallo,

ahhh, da wäre ich nicht drauf gekommen. Ok, und das mit dem Matrixnamen macht Sinn.
Also ich habe es jetzt fast so, wie ich es haben möchte:
\documentclass[11pt,a4paper]{article} 
\usepackage[T1]{fontenc} 
\usepackage{xcolor} 
\usepackage{listings} 
\usepackage{tikz} 
\usetikzlibrary{calc,decorations.pathreplacing,matrix} 

\colorlet{bgcolor}{white}    % Farbe für background 
\colorlet{ccolor}{darkgray}  % Farbe für comments 
\colorlet{kwcolor}{red}      % Farbe für keywords 
\colorlet{scolor}{green}     % Farbe für strings 

\lstset{ 
  language=Haskell, 
  basicstyle=\ttfamily, 
  numbers=left, 
  showstringspaces=false, 
  commentstyle=\itshape\color{ccolor}, 
  keywordstyle=\bfseries\color{kwcolor}, 
  stringstyle=\color{scolor}, 
  backgroundcolor=\color{bgcolor}, 
  breaklines=true, 
  breakautoindent=true, 
  columns=flexible, 
  frame=single, 
  captionpos=b, 
  xleftmargin=3em, 
  xrightmargin=1em, 
  aboveskip=10pt 
} 

\begin{document} 
\begin{lstlisting}[title={Program P},label=P,mathescape=true] 
f(a,b) = if b = 1 then a else 1:g(a,b-1,a) 
g(c,d,e) = if d = 1 then e$\cdot$c else 2:g(c,d-1,e$\cdot$c) 
\end{lstlisting} 

\begin{tikzpicture} 
  \matrix (lstline) [% 
    matrix of nodes, 
    nodes={anchor=base,font=\ttfamily} 
  ] { 
    f(a,b) & = & |[kwcolor]|if & b & = & 1 & |[kwcolor]|then & a & |[kwcolor]|else & 1:g(a,b-1,a) \\ 
  }; 
  \draw[decorate,decoration=brace] ($(lstline-1-1.south east)+(-0.9em,0.5ex)$) -- ($(lstline-1-1.south west)+(1.4em,0.5ex)$) 								node[below,pos=0.5,font=\scriptsize] {parameters}; 
\draw[decorate,decoration=brace] (lstline-1-10.south east) -- (lstline-1-3.south west) node[below,pos=0.5,font=\scriptsize] {function body};
 \draw[decorate,decoration=brace] (lstline-1-10.north west) -- (lstline-1-10.north east) node[above,pos=0.5,font=\scriptsize] {a call};
\end{tikzpicture} 
Aber irgendwie ist die "function body" Schleife schief. Ich habe das Konzept auch noch nicht recht begriffen....
\draw[decorate,decoration=brace] (lstline-1-10.south east) -- (lstline-1-3.south west) node[below,pos=0.5,font=\scriptsize] {function body};
Gut, ich sage also draw, dass er ne Schleife machen soll. Dann gebe ich den ersten Knoten an, dann den zweiten, also von wo bis wo die Schleife sein soll. Mit south est etc spezifiziere ich den genauen anchor. Was genau sagt das node[...]? Warum ist die Schleife "falsch" rum, wenn ich zuerst den anderen Knoten als Ausgangspunkt wähle?

Gruß
Guenter

GuenterW.

Beitrag von GuenterW. »

Hey,

ändern der betreffenden Zeile in
\draw[decorate,decoration=brace] ($(lstline-1-10.south east)+(0,0.5ex)$) -- (lstline-1-3.south west)  node[below,pos=0.5,font=\scriptsize] {function body};
schafft Abhilfe. Hätte ich auch früher drauf kommen können. Ich nehme an, es liegt daran, dass die bounding box für den node mit g drin weiter nach unten reicht.
Nochmal interesseshalber: Wie würde ich eine Zeile einer Matrix so ausrichten, dass die unteren Kanten der bounding boxen auf einer Linie stehen und nicht die Zentren der Knoten?

Benutzeravatar
localghost
Forum-Meister
Forum-Meister
Beiträge: 825
Registriert: Di 8. Jul 2008, 15:40
Wohnort: Braunschweig

Beitrag von localghost »

GuenterW. hat geschrieben:[…] Ich nehme an, es liegt daran, dass die bounding box für den node mit g drin weiter nach unten reicht.
Nochmal interesseshalber: Wie würde ich eine Zeile einer Matrix so ausrichten, dass die unteren Kanten der bounding boxen auf einer Linie stehen und nicht die Zentren der Knoten?
Das mit den Knoten und deren Inhalt ist so eine Sache. In der Tat spielt der Inhalt bei den Ausmaßen eine Rolle.

Du könntest auch durch ein Phantom vorgaukeln, dass sich in einer Zelle der Matrix ein bestimmter Inhalt befindet. Ich gebe mal nur den relevanten Teil an.
  \matrix (lstline) [%
    matrix of nodes,
    nodes={anchor=base,font=\ttfamily}
  ] {
    f(a,b) & = & |[kwcolor]|if\vphantom{g} & b & = & 1 & |[kwcolor]|then & a & |[kwcolor]|else & 14g(a,b-1,a) \\
  };
Allerdings sehe ich das nicht als sehr elegant an und würde mir eine bessere Lösung wünschen.
TeX und LaTeX, Fragen und Antworten – TeXwelt

¹ Es tut mir Leid. Meine Antworten sind begrenzt. Sie müssen die richtigen Fragen stellen.
² System: openSUSE 13.1 (Linux 3.11.6), TeX Live 2013, TeXworks 0.5 (r1349)
³ Lernt gerade TeX (und versucht, es zu verstehen).

Antworten