lstinline verschluckt Leerzeichen

Schriftbild, Absätze und Auflistungen einstellen


meepleep
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mo 26. Okt 2009, 20:30

lstinline verschluckt Leerzeichen

Beitrag von meepleep »

Hallo zusammen.

Vorweg: Google benutzt, Problem ist ein ganz kleines, ich hoffe, irgendwer weiß Bescheid.

Folgend das Minimal example:
\documentclass{article}

\usepackage [ngerman] {babel}



\usepackage{listings}
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt}
\lstset{language=C++}
\lstset{captionpos=b}
\lstset{basicstyle=\ttfamily}
\lstset{aboveskip=24pt, belowskip=12pt}
\lstset{showstringspaces=false, frame=single, breaklines=true}
\lstset{xleftmargin=6mm, xrightmargin=4mm}

\begin{document}

good:

\verb|normal = plane - (plane . e0) ^ einf;|

\verb|hm = e0 ^ einf;|

bad:

\lstinline|normal = plane - (plane . e0) ^ einf;|

\lstinline|hm = e0 ^ einf;|

\end{document}
Das Problem Nr. 1 ist: Der Output von verb und lstinline sollte in diesem Fall im Prinzip gleich sein (finde ich), ist er aber nicht, zumindest nicht bei mir.

Das Problem Nr. 2 ist: Das echte Problem. lstinline verschluckt bei mir Leerzeichen. Und zwar sehr selektiv. Ich will jetzt nicht schreiben, was ich alles getestet habe, aber offenbar mag er keine Leerzeichen zwischen Klammern und Accentcircumflexes. \verb wertet alles so aus, wie ich das erwarten würde:
normal = plane - (plane . e0) ^ einf;
hm = e0 ^ einf;
\lstinline aber so:
normal = plane - (plane . e0)^ einf;
hm = e0 ^ einf;

Ich wäre sehr froh, wenn mir das jemand erklären könnte... das warum vor allem. Und wenn er/sie mir nach Möglichkeit sagen könnte, wie ich \lstinline benutzen kann, ohne dass das Leerzeichen verschwindet. :)

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Dass ist doch mal n MB...

die Option heißt keepspaces siehe listings-Doku
\documentclass{article} 
\usepackage[latin1]{inputenc}




\usepackage{listings} 
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt,language=C++, captionpos=b,basicstyle=\ttfamily,aboveskip=24pt, belowskip=12pt,showstringspaces=false, frame=single, breaklines=true, xleftmargin=6mm, xrightmargin=4mm} % ,keepspaces}
% Geht auch alles in ein lstset, vgl. listings-Doku
% Ich würde im übrigen einen eigenen listings-Style definieren, macht etwas mehr Schreibarbeit, aber wenn dein Dokument mal unerwartet anwächst, dann bist du froh darüber


\begin{document} 

good: 

\verb|normal = plane - (plane . e0) ^ einf;| 

\verb|hm = e0 ^ einf;| 

bad: 

\lstinline[keepspaces]|normal = plane - (plane . e0) ^ einf;|
\lstinline|normal = plane - (plane . e0) ^ einf;| 

\lstinline[keepspaces]|hm = e0  ^ einf;| 


%Entweder global oder lokal, wie du willst. 
\end{document}

Ansonsten kann ich keine Unterschiede mehr entdecken zwischen den beiden Umgebungen. Das warum fragst du am besten das Paket, bzw. die Source. Das ganze hat was mit dem Spalten Paradigma von listings zu tun. Er versuch irgendwie das ganze in Spalten einzuordnen und dabei wird im default Fall ein Zeichen nach der ( in die gleiche Spalte gesetzt. (Zumindest kann das vorkommen...) Aber das wird dir die Seite 19 im der listings-Doku besser erklären, wie ich das kann.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


meepleep
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mo 26. Okt 2009, 20:30

Beitrag von meepleep »

Cool, funzt. Danke! Auch für die Erklärung.

hajoe

Re: lstinline verschluckt Leerzeichen

Beitrag von hajoe »

Funzt, konnte ich nachvollziehen. Das ist nur mühsam, die immer gleichen lstinline-Parameter immer wieder neu zu tippen. Also habe ich probiert:

\newcommand{\code}[1]{\lstinline[columns=fixed,basicstyle=\ttfamily\bfseries\small,keepspaces]{#1}}

und dann

\code{normal = plane - (plane . e0) ^ <mehrere Leerzeichen> einf;}

Und hier werden wieder statt mehrerer Leerzeichen nur eines gesetzt. Was mache ich falsch?? Danke!

MoeWe
Forum-Meister
Forum-Meister
Beiträge: 805
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Re: lstinline verschluckt Leerzeichen

Beitrag von MoeWe »

Du kannst mit \lstset die Parameter einfach global setzen. Dann reicht es, nur \lstinline aufzurufen.
\documentclass{article}

\usepackage{listings}
\lstset{columns=fixed,basicstyle=\ttfamily\bfseries\small,keepspaces}

\begin{document}
Lorem  \lstinline{normal = plane - (plane . e0) ^   einf;} ipsum
\end{document}
Alternativ klappt die folgende Lösung, da TeX dann das Argument, das hier speziell behandelt werden muss, nicht als Argument eines anderen Makros lesen muss (wo diese Spezialbehandlung dann nicht funktioniert).
\documentclass{article}

\usepackage{listings}
\newcommand*{\code}{\lstinline[columns=fixed,basicstyle=\ttfamily\bfseries\small,keepspaces]}

\begin{document}
Lorem  \code{normal = plane - (plane . e0) ^   einf;} ipsum
\end{document}


Hmmm. Ich habe nur auf die Leerzeichen geachtet, merke aber gerade, dass columns=fixed hier nicht mit \lstset funktioniert, da das bei \lstinline offenbar immer explizit erfragt werden muss (zumindest verstehe ich die Dokumentation so).

Antworten