行为类似于字体更改命令的宏(影响当前组的其余部分)

行为类似于字体更改命令的宏(影响当前组的其余部分)

许多 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}

相关内容