使用颜色框突出显示列表中的代码片段会改变字符并破坏边框

使用颜色框突出显示列表中的代码片段会改变字符并破坏边框

我正在使用带有 texlive 2021 的 Texstudio。为了突出显示以下代码片段中的某些行lstlisting,我使用colorbox

        \begin{lstlisting}[style=listing1]
        |\colorbox{yellow}{if(a >= b)}| 
           return 2*a;
        return 2*b;
        \end{lstlisting}

完整代码如下:

\documentclass[11pt]{article}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{xcolor}

\lstdefinestyle{listing1}{
    tabsize=1, 
    frame=single, 
    framerule=2pt, 
    frameround=tttt,       
    breakatwhitespace=false,          
    breaklines=true,                 
    deletekeywords={...},            
    escapeinside={\%*}{*)},           
    keepspaces=true,                 
    morekeywords={*,...},      
    numbers=left,                  
    numberstyle=\tiny\color{gray}, 
    rulecolor=\color{black},         
    showspaces=false,               
    showstringspaces=false,          
    showtabs=false,                  
    stepnumber=1,                    
    title=\lstname,
    linewidth=3.8cm, 
    xleftmargin=0.2cm, 
    escapechar=|, 
}


\begin{document}
    
\begin{lstlisting}[style=listing1]
    |\colorbox{yellow}{if(a >= b)}| 
       return 2*a;
    return 2*b;
\end{lstlisting}
\end{document} 

有两个问题:边框损坏,字符>变为?。有什么想法吗?

在此处输入图片描述

请不要建议使用lstlinebgrd因为它会引发错误这里在 TexLive 2021 中,尚未修复。解决方案这里对我没用。

答案1

您可以使用 T1 编码摆脱错误的符号。

您可以通过缩小颜色框(通过更改 \fboxsep)或扩大线条距离来避免边框间隙。更好的解决方案是使用 tcolorbox 作为框架。

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{xcolor}

\lstdefinestyle{listing1}{
    tabsize=1,
    frame=single,
    framerule=2pt,
    frameround=tttt,
    breakatwhitespace=false,
    breaklines=true,
    deletekeywords={...},
    escapeinside={\%*}{*)},
    keepspaces=true,
    morekeywords={*,...},
    numbers=left,
    numberstyle=\tiny\color{gray},
    rulecolor=\color{black},
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    stepnumber=1,
    title=\lstname,
    linewidth=3.8cm,
    xleftmargin=0.2cm,
    escapechar=|,
}

%\AddToHook{env/lstlisting/begin}{\fboxsep=0pt} %smaller colorbox
\AddToHook{env/lstlisting/begin}{\fontsize{11pt}{19pt}\selectfont} %larger line distance
\begin{document}

\begin{lstlisting}[style=listing1]
    |\colorbox{yellow}{if(a >= b)}|
       return 2*a;
    return 2*b;
\end{lstlisting}
\end{document}

答案2

我知道这不是您想要看到的,但是我不太擅长列出,希望 MWE 能够帮助您获得您需要的结果。

在此处输入图片描述

\documentclass[a4paper]{article}
\usepackage{scrextend}
\usepackage[T1,T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}
\usepackage{tabularx}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{moreverb}
\usepackage{enumitem}


\usepackage{listings}
\lstset{
language=C,                 
morekeywords={*,...},      
numbers=left,                  
numbersep=10pt,              
numberstyle=\tiny\color{gray}, 
rulecolor=\color{black},         
showspaces=false,               
showstringspaces=false,          
showtabs=false,                  
stepnumber=1,                    
stringstyle=\color{mymauve},     
title=\lstname,
        basicstyle=\ttfamily,
        showstringspaces=false,
        breaklines=true,
        keywordstyle={},
        frame=none,%              changed to "none"
        rulecolor=\color{gray},
        escapechar=|
}


\begin{document}

\begin{mdframed}[roundcorner=10pt,leftmargin=1cm,rightmargin=5cm,%
innerleftmargin=1cm,innerrightmargin=1cm]
\begin{lstlisting}
|\colorbox{green}{if(a >= b)}| 
  return 2*a;
    return 2*b;
\end{lstlisting}
\end{mdframed}
        

\end{document}

相关内容