许多 LaTeX 软件包都提供了一个接口,可以使用标准的“无参数”字体命令(例如\bfseries
、\sffamily
或 )来修改某些元素的排版\color{red}
。所有这些命令都是“无参数”的,因为它们不会获取要格式化的内容的宏参数,但会一直有效直到当前组结束。所以:
Standard, but we {switch to \bfseries bold and \color{red} red until the end} of the group.
给我们:
但是,如果要应用某种格式的宏不是“无参数的”,但需要“无参数”宏,该怎么办? MWE 使用和演示了这个\fbox
问题listings
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings,xcolor,beramono}
\lstset{language=C,basicstyle=\ttfamily,keywordstyle=\bfseries}
\lstset{moredelim=**[is][\color{red}]{<}{>}} % works
\lstset{moredelim=**[is][\mystyle]{@}{@}} % hmmm...
\def\mystyle{\fbox} % how to get the parameter to for \fbox?
\begin{document}
\begin{lstlisting}[gobble=4]
int main() {
if( printf ("Hello, <tex.se!") == 0 )
<return -1;> // error!
@return 0;@ // success
}
\end{lstlisting}
\end{document}
如您所见,\fbox
受影响行的开头出现了一个小的,但目标是它应该在返回0;。是否可以定义\mystyle
一种方式,使其检索直到组末尾的所有内容,然后可以(稳健地)将其传递给\fbox
?
答案1
LaTeX2e 引入了lrbox
一种环境形式\sbox
来解决这种情况。LaTeX 附带的 usrguide.tex 有这个制作框架小页面的示例
\newsavebox{\fmbox}
\newenvironment{fmpage}[1]
{\begin{lrbox}{\fmbox}\begin{minipage}{#1}}
{\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}}
当然,对于在事物周围放置框架的特定例子,现在已有许多包具有更复杂的变体。
我不太了解 listings 包,可能有更简单的方法来使用环境语法,但这似乎有效:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings,xcolor,beramono}
\lstset{language=C,basicstyle=\ttfamily,keywordstyle=\bfseries}
\lstset{moredelim=**[is][\color{red}]{<}{>}} % works
\lstset{moredelim=**[is][\mystyle]{@}{@}} % hmmm...
\newsavebox{\flrbx}
\newenvironment{flrbox}
{\begin{lrbox}{\flrbx}}
{\end{lrbox}\fbox{\usebox{\flrbx}}}
\def\mystyle{\begin{flrbox}\bgroup\aftergroup\emystyle}
\def\emystyle{\end{flrbox}\egroup}
\begin{document}
\begin{lstlisting}[gobble=4]
int main() {
if( printf ("Hello, <tex.se!") == 0 )
<return -1;> // error!
@return 0;@ // success
}
\end{lstlisting}
\end{document}
答案2
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings,xcolor,beramono}
\lstset{language=C,basicstyle=\ttfamily,keywordstyle=\bfseries}
\lstset{moredelim=**[is][\color{red}]{<}{>}} % works
\lstset{moredelim=**[is][\mystyle]{@}{@}} % hmmm...
\def\mystyle{} % how to get the parameter to for \fbox?
\begin{document}
\begin{lstlisting}[gobble=4,escapechar=&]
int main() {
if( printf ("Hello, <tex.se!") == 0 )
<return -1;> // error!
@&\fbox{\bfseries return 0;}&@ // success
}
\end{lstlisting}
\end{document}