在自定义命令中排版文本(类似于逐字)?

在自定义命令中排版文本(类似于逐字)?

我正在尝试定义一个新命令,将文本置于彩色背景中,完全按照 .tex 文件中的定义方式重现它(与逐字复制类似),并且不会强迫我在 .tex 文件中使用复杂的数学符号。后一点是复杂的部分。这是我目前所拥有的:

\documentclass[10pt]{article}
\usepackage{color}
\definecolor{customblue}{RGB}{235,241,245}
\newcommand{\terminalCommand}[1]{\colorbox{customblue}{#1}}

\begin{document}
 \begin{itemize}
 \item \terminalCommand{# SUDO_EDITOR="/usr/bin/vim -p -X" visudo} %Generates missing $ errors
 \item \terminalCommand{\# SUDO\_EDITOR="/usr/bin/vim -p -X" visudo} %Doesn't generate errors, but text is garbled and doesn't copy properly
\end{itemize}
\end{document}

第一个\terminalCommand会产生大量inserted missing $错误,其中包括_。第二个\terminalCommand不会产生任何错误,但下划线不会显示在副本中,并且 PDF 输出中的间距有点不对,这使得无法复制到 shell 中。

有没有一种通用的方法可以改变这个命令,以便它以类似于逐字的方式重现其中的文本? 我一直在将此代码用于更大的 shell 命令块,但现在我正在寻找内联的东西:

\documentclass[10pt]{article}
\usepackage{color}
\usepackage{listings}

\definecolor{customblue}{RGB}{235,241,245}
\newcommand{\terminalCommand}[1]{\colorbox{customblue}{#1}}

\lstnewenvironment{terminalblock}{%
  \lstset{backgroundcolor=\color{customblue},
  frame=single,
  framerule=0pt,
  basicstyle=\ttfamily,
  breaklines=true,
  columns=fullflexible}}{}

\begin{document}
 \begin{terminalblock}
  # SUDO_EDITOR="/usr/bin/vim -p -X" visudo
 \end{terminalblock}
\end{document}

我使用 寻求解决方案\verb,但构造命令的逻辑方式 ( \newcommand{\terminalCommand}[1]{\colorbox{customblue}{\verb= #1 =}}) 返回错误\verb illegal in command argument

答案1

您可以\lstinline与解决方案一起使用如何重新定义 \lstinline 以自动突出显示或绘制所有内联代码片段周围的框架?为内联代码片段添加颜色

因此,以下代码

 \begin{itemize}
   \item \lstinline{# SUDO_EDITOR="/usr/bin/vim -p -X" visudo} 
   \item \lstinline{\# SUDO\_EDITOR="/usr/bin/vim -p -X" visudo} 
\end{itemize}

生成:

在此处输入图片描述

已知的问题:

  • 突出显示不能正确跨越换行符。

您还可以定义一个特殊字符作为代替的分隔符\lstinline{},因此以下结果与上图相同。

\lstMakeShortInline[basicstyle=\ttfamily]{|}

 \begin{itemize}
   \item |# SUDO_EDITOR="/usr/bin/vim -p -X" visudo| 
   \item |\# SUDO\_EDITOR="/usr/bin/vim -p -X" visudo| 
 \end{itemize}

代码:

\documentclass[10pt]{article}
\usepackage{color}
\usepackage{listings}
\usepackage{etoolbox}
\usepackage{atbegshi,ifthen,tikz}

\definecolor{customblue}{RGB}{235,241,245}


% change this to customize the appearance of the highlight
\tikzstyle{highlighter} = [
  customblue,
  line width = \baselineskip,
]

% enable these two lines for a more human-looking highlight
%\usetikzlibrary{decorations.pathmorphing}
%\tikzstyle{highlighter} += [decorate, decoration = random steps]

% implementation of the core highlighting logic; do not change!
\newcounter{highlight}[page]
\newcommand{\tikzhighlightanchor}[1]{\ensuremath{\vcenter{\hbox{\tikz[remember picture, overlay]{\coordinate (#1 highlight \arabic{highlight});}}}}}
\newcommand{\bh}[0]{\stepcounter{highlight}\tikzhighlightanchor{begin}}
\newcommand{\eh}[0]{\tikzhighlightanchor{end}}
\AtBeginShipout{\AtBeginShipoutUpperLeft{\ifthenelse{\value{highlight} > 0}{\tikz[remember picture, overlay]{\foreach \stroke in {1,...,\arabic{highlight}} \draw[highlighter] (begin highlight \stroke) -- (end highlight \stroke);}}{}}}
%--------------------------


\makeatletter %   Redefine macros from listings package:
\newtoggle{@InInlineListing}%
\togglefalse{@InInlineListing}%

\renewcommand\lstinline[1][]{%
    \leavevmode\bgroup\toggletrue{@InInlineListing}\bh % \hbox\bgroup --> \bgroup
      \def\lst@boxpos{b}%
      \lsthk@PreSet\lstset{flexiblecolumns,#1}%
      \lsthk@TextStyle
      \@ifnextchar\bgroup{\afterassignment\lst@InlineG \let\@let@token}%
                         \lstinline@}%

\def\lst@LeaveAllModes{%
    \ifnum\lst@mode=\lst@nomode
        \expandafter\lsthk@EndGroup\iftoggle{@InInlineListing}{\eh{}}{}%
    \else
        \expandafter\egroup\expandafter\lst@LeaveAllModes
    \fi%
    }
\makeatother


\lstset{backgroundcolor=\color{customblue},basicstyle=\ttfamily,}%


\begin{document}
 \begin{itemize}
   \item \lstinline{# SUDO_EDITOR="/usr/bin/vim -p -X" visudo} 
   \item \lstinline{\# SUDO\_EDITOR="/usr/bin/vim -p -X" visudo} 
\end{itemize}
\end{document}

相关内容