获取粗体输入文本
我一直使用listings
它来格式化我的代码,并且偶尔使用以下解决方案来使一些输入的文本变得粗体:
\DeclareFontShape{OT1}{cmtt}{bx}{n}{<5><6><7><8><9><10><10.95><12><14.4><17.28><20.74><24.88>cmttb10}{}
不过,我通常用黑色文本,但我刚刚注意到这不会保留listings
包装突出显示时的颜色。
它在彩色的listings
平均能量损失
\documentclass[10pt]{extarticle}
\usepackage{color}
\usepackage{listings}
\lstset{stringstyle=\color[rgb]{.627,.126,.941}, basicstyle={\fontfamily{cmtt}\selectfont\footnotesize},showstringspaces=false}
\DeclareFontShape{OT1}{cmtt}{bx}{n}{<5><6><7><8><9><10><10.95><12><14.4><17.28><20.74><24.88>cmttb10}{}
\begin{document}
\ttfamily Something in \textbf{bold}. {\color{red} Something else in \textbf{bold}.}
\begin{lstlisting}[escapechar=@]
Something @\textbf{important}@ right here.
\end{lstlisting}
\begin{lstlisting}[language=C, escapechar=@]
int main()
{
int = 1;
char * s = "@something@ @\textbf{important}@ right @\color[rgb]{.627,.126,.941} \bfseries here@"
"and a normal string for comparison";
}
\end{lstlisting}
\end{document}
是否有可能继承想要赋予的@\textbf{...}@
颜色?listings
答案1
获得所需结果的一种方法是将字符串重新定义为分隔符。我们基于 C 语言定义一种新语言。然后我们删除默认的字符串定义,deletestring=[b]"
并将其替换为新的分隔环境moredelim=**[s][...]{"}{"}
。**
指示listings
在此环境中累积样式,以便我们可以将其定义@...@
为另一个设置其中粗体字体的样式。现在不再需要转义列表了。
分隔符类型的缺点**
是它还会累积字符串文字中出现的关键字和其他特殊语法元素的样式。为了防止这种情况,我们必须定义一个新的切换开关来跟踪我们当前是否在字符串文字内。切换开关作为字符串文字样式的一部分设置为 true,并通过钩子重置,每次离开分隔符EndGroup
时都会执行该钩子。listings
定义了一个新命令\nostringstyle
,每当为各种语法元素设置样式时(例如keywordstyle
)都必须使用该命令。根据切换状态,仅当该元素出现在字符串文字之外时才会应用样式。
完整示例代码(另请注意粗体“int”关键字):
\documentclass[10pt]{article}
\usepackage{xcolor}
\usepackage{listings}
\makeatletter
\newif\if@instring
\@instringfalse
\newcommand\nostringstyle[1]{\if@instring\else#1\fi}
\lst@AddToHook{EndGroup}{\global\@instringfalse}
\lstset{
basicstyle={\fontfamily{cmtt}\selectfont\footnotesize},
}
\DeclareFontShape{OT1}{cmtt}{bx}{n}{<5><6><7><8><9><10><10.95><12><14.4><17.28><20.74><24.88>cmttb10}{}
\lstdefinelanguage{myC}[ANSI]{C}{
deletestring=[b]",
keywordstyle={\nostringstyle{\color{blue}}},
moredelim=**[s][{\global\@instringtrue\color[rgb]{.627,.126,.941}}]{"}{"},
moredelim=**[is][{\bfseries}]{@}{@},
showstringspaces=false
}
\makeatother
\begin{document}
\noindent\ttfamily Something in \textbf{bold}. {\color{red} Something else in \textbf{bold}.}
\begin{lstlisting}[language=myC]
int main()
{
@int@ = 1;
char * s = "something @important@ right @here@"
"and a normal string for comparison";
}
\end{lstlisting}
\end{document}