Seite 1 von 1

lstinline verschluckt Leerzeichen

Verfasst: Di 19. Okt 2010, 18:15
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. :)

Verfasst: Di 19. Okt 2010, 18:36
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.

Verfasst: Di 19. Okt 2010, 19:03
von meepleep
Cool, funzt. Danke! Auch für die Erklärung.

Re: lstinline verschluckt Leerzeichen

Verfasst: Mi 8. Mai 2024, 16:26
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!

Re: lstinline verschluckt Leerzeichen

Verfasst: Mi 8. Mai 2024, 17:28
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).