В этом примере:
\documentclass{article}
\usepackage{listings}
\lstset{
language=c++,
extendedchars=true,
inputencoding=utf8,
literate={::}{{::}}2
}
\begin{document}
\begin{lstlisting}
std::mutex mtx;
\end{lstlisting}
\end{document}
Что я получаю, так это std :: mutex mtx;
. Мне не нужны эти автоматические пробелы в режиме листинга.
Есть ли способ их отключить?
решение1
Это следствие настройки по умолчанию фиксированных столбцов, т. е. каждый символ имеет одинаковую ширину. Поскольку символ :
не очень широкий, он выглядит так, как будто вводится пробел.
Обходной путь — установить ширину literate в ::
1 символ, т. е. literate={::}{{::}}1
. В противном случае вы можете использовать гибкие или полностью гибкие столбцы. Другим вариантом будет использование шрифта teletype, в этом случае символы ::
будут шире и равномерно распределены, так что не будет казаться, что введены дополнительные пробелы.
МВЭ:
\documentclass{article}
\usepackage{listings}
\lstset{frame=single}
\begin{document}
\noindent \textit{Flexible columns:}
\begin{lstlisting}[columns=flexible]
std;;mutex mtx;
wwwwwwwwwwwwww;
std::mutex mtx;
\end{lstlisting}
\noindent \textit{Full-flexible columns:}
\begin{lstlisting}[columns=fullflexible]
std;;mutex mtx;
wwwwwwwwwwwwww;
std::mutex mtx;
\end{lstlisting}
\lstset{
columns=fixed,
language=c++,
extendedchars=true,
inputencoding=utf8,
literate={::}{{::}}1
}
\noindent\textit{Fixed columns, :: seen as 1 character:}
\begin{lstlisting}
std;;mutex mtx;
wwwwwwwwwwwwww;
std::mutex mtx;
\end{lstlisting}
\lstset{
columns=fixed,
language=c++,
extendedchars=true,
inputencoding=utf8,
basicstyle=\ttfamily,
literate={::}{{::}}2
}
\noindent\textit{Fixed columns, :: seen as 2 characters, teletype font:}
\begin{lstlisting}
std;;mutex mtx;
wwwwwwwwwwwwww;
std::mutex mtx;
\end{lstlisting}
\end{document}
Результат: