以文本形式列出文件夹结构不起作用

以文本形式列出文件夹结构不起作用

对于我的文档,我需要提供一种在项目中构造一些 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}

结果:

在此处输入图片描述

相关内容