对于我的文档,我需要提供一种在项目中构造一些 Python 代码的方法。我展示它的方法是简单地使用如下文本结构:
app/
├─ ...
├─ controllers/
│ ├─ ...
├─ services/
│ ├─ __init__.py
│ ├─ issuesService.py
│ ├─ projectsService.py
│ ├─ sprintsServices.py
│ ├─ ...
│ ├─ providerService.py
├─ providers/
│ ├─ ...
├─ ...
由于我也在文档中展示了一些 Python 代码,因此我使用了lstlisting
类似这样的代码:
\begin{lstlisting}[language=Python, caption=A fancy caption]
some code here
\end{lstlisting}
这完全可以正常工作,尽管它不适用于上面的 txt 输入......
我的列表的配置样式如下所示:
%JetBrains Mono-Font für Code
\setmonofont{JetBrains Mono}[
Path = ./Fonts/Code/,
Extension = .ttf,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic,
Contextuals = Alternate,
]
\lstset{
basicstyle = \ttfamily,
columns = flexible,
aboveskip=\baselineskip,
belowskip=\baselineskip
}
\makeatletter
\renewcommand*\verbatim@nolig@list{}
\makeatother
\definecolor{codegreen}{HTML}{067D17}
\definecolor{codegray}{HTML}{969696}
\definecolor{codepurple}{HTML}{871094}
\definecolor{codeblue}{HTML}{0086B3}
\definecolor{codeblack}{HTML}{333333}
\definecolor{background}{HTML}{F5F5F5}
\lstdefinestyle{codestyle}{
backgroundcolor=\color{background},
commentstyle=\color{codepurple},
keywordstyle=\color{codeblue},
identifierstyle=\color{codeblack},
stringstyle=\color{codegreen},
numberstyle=\small\color{codegray},
basicstyle=\ttfamily\small,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
tabsize=2
}
\lstset{style=codestyle}
\definecolor{delim}{RGB}{20,105,176}
\definecolor{numb}{RGB}{106, 109, 32}
\definecolor{string}{rgb}{0.64,0.08,0.08}
\lstdefinelanguage{JSON}{
rulecolor=\color{black},
postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{gray}\hookrightarrow\space}},
upquote=true,
morestring=[b]",
stringstyle=\color{string},
literate=
*{0}{{{\color{numb}0}}}{1}
{1}{{{\color{numb}1}}}{1}
{2}{{{\color{numb}2}}}{1}
{3}{{{\color{numb}3}}}{1}
{4}{{{\color{numb}4}}}{1}
{5}{{{\color{numb}5}}}{1}
{6}{{{\color{numb}6}}}{1}
{7}{{{\color{numb}7}}}{1}
{8}{{{\color{numb}8}}}{1}
{9}{{{\color{numb}9}}}{1}
{\{}{{{\color{delim}{\{}}}}{1}
{\}}{{{\color{delim}{\}}}}}{1}
{[}{{{\color{delim}{[}}}}{1}
{]}{{{\color{delim}{]}}}}{1},
}
它对其他语言也不起作用...我猜想列表中的 ═─ 和 | 存在问题。有人知道问题出在哪里吗?或者可以推荐另一个软件包吗?
答案1
这个答案由两部分组成。第一部分:为了让列表能够使用 Fontspec 在 XeLaTeX 或 LuaLaTeX 中正确识别和定位 ═ 和 │ 等字符,您需要使用列表将 Unicode 字符代码添加到字母列表中,然后https://tex.stackexchange.com/a/25396/. 字符 ⁄ 和 ─ 和 ⁄ 的代码分别为 251c、2500、2502(见https://www.compart.com/en/unicode/block/U+2500)。您还需要extendedchars=true
在列表选项中。
梅威瑟:
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\usepackage{listings}
\setmonofont{Go Mono}
\definecolor{background}{HTML}{F5F5F5}
\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
\lst@CCECUse \lst@ProcessLetter
^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
^^^^251c^^^^2500^^^^2502% box drawing characters
^^00}
\lst@RestoreCatcodes
\makeatother
\lstdefinestyle{codestyle}{
backgroundcolor=\color{background},
basicstyle=\ttfamily\small,
captionpos=b,
numbers=left,
numbersep=5pt,
columns=flexible,
keepspaces,
frame=single,
tabsize=2,
extendedchars=true,
}
\lstset{style=codestyle}
\begin{document}
\begin{lstlisting}[caption=A fancy caption]
app/
├─ ...
├─ controllers/
│ ├─ ...
├─ services/
│ ├─ __init__.py
│ ├─ issuesService.py
│ ├─ projectsService.py
│ ├─ sprintsServices.py
│ ├─ ...
│ ├─ providerService.py
├─ providers/
│ ├─ ...
├─ ...
\end{lstlisting}
\end{document}
结果:
答案的第二部分是关于线条之间的垂直间隙。
此问题是由方框绘制字符引入的额外行高引起的。列表背景绘制未正确考虑此额外行高。
针对此问题的解决方案是使用包并使用选项为每个字符pmboxdraw
指定一个替换命令,同时使方框绘制字符具有连续的外观,如下所示\lstset{}
literate
如何在 lstlisting 环境中使用扩展 ASCII 字符?。pmboxdraw
命令不计算线条的高度,因此线条可以绘制为与背景相同的高度。
代码:
% ... add unicode character handling code as above ...
\usepackage{pmboxdraw}
% ... other lstset definitions as above ...
\lstset{literate=
{┐}{\textSFiii}1%
{└}{\textSFii}1%
{┴}{\textSFvii}1%
{┬}{\textSFvi}1%
{├}{\textSFviii}1%
{─}{\textSFx}1%
{┼}{\textSFv}1%
{│}{\textSFxi}1%
}
\begin{lstlisting}[caption=A fancy caption]
app/
├─ ...
├─ controllers/
% ...
结果:
如果仔细观察,您仍然可以看到一个非常小的间隙(取决于查看器和缩放级别)。要完全解决这个问题,您可以改为绘制框架和背景mdframed
,如下所示使用 \mdframed 为 \lstnewenvironment 添加标题。在这种情况下,整个框架都是彩色的,而不是单条线条。您可以在有或没有的情况下使用此方法pmboxdraw
。
梅威瑟:
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\usepackage{listings}
\usepackage{mdframed}
\usepackage{caption}
\setmonofont{Go Mono}
\definecolor{background}{HTML}{F5F5F5}
\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
\lst@CCECUse \lst@ProcessLetter
^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
^^^^251c^^^^2500^^^^2502% box drawing characters
^^00}
\lst@RestoreCatcodes
\makeatother
\lstdefinestyle{codestyle}{
backgroundcolor=\color{background},
basicstyle=\ttfamily\small,
captionpos=b,
numbers=left,
numbersep=5pt,
columns=flexible,
keepspaces,
frame=single,
tabsize=2,
extendedchars=true,
}
\lstset{style=codestyle}
\lstnewenvironment{mylisting}[1]{%
\lstset{
backgroundcolor=,
frame=none,
}%
\mdframed[backgroundcolor=background,innerleftmargin=2pt,innertopmargin=-0.3Em, innerbottommargin=-0.3Em]%
}{%
\endmdframed%
\captionsetup[lstlisting]{skip=-8pt}%
\captionof{lstlisting}{#1}
\ignorespaces
}
\begin{document}
\begin{mylisting}{A fancy caption}
app/
├─ ...
├─ controllers/
│ ├─ ...
├─ services/
│ ├─ __init__.py
│ ├─ issuesService.py
│ ├─ projectsService.py
│ ├─ sprintsServices.py
│ ├─ ...
│ ├─ providerService.py
├─ providers/
│ ├─ ...
├─ ...
\end{mylisting}
\end{document}
结果: