由于我需要将逐字环境传递到命令中,因此我使用\savebox
它并将其与其余文本一起内联呈现。
\documentclass{article}
\usepackage{listings}
\usepackage{enumitem}
\usepackage{mdframed}
\setlength{\textwidth}{500pt}
\setlength{\oddsidemargin}{-20pt}
\setlength{\evensidemargin}{-20pt}
% Define questions environment with framed \question
\newcommand{\questionlabel}{Question }
\newcommand{\restorequestionlabel}{\renewcommand{\questionlabel}{Question }}
\newcommand{\setquestionlabel}[1]{\renewcommand{\questionlabel}{#1 }}
\newlist{questions}{enumerate}{4}
\setlist[questions]{align=left,ref=\questionlabel\arabic*,label=\textbf{\questionlabel\arabic*.},wide}
\newcommand{\itembr}{\needspace{10\baselineskip}\item\mbox{}}
\newcommand{\question}[1]{\itembr\begin{mdframed}#1\end{mdframed}}
\begin{document}
\begin{questions}
\begin{lrbox}{0}
\begin{lstlisting}[language=C]
int* p = (int*) malloc(100 * sizeof(int));
\end{lstlisting}
\end{lrbox}
\question{
Explain what \usebox{0} does.
}
\end{questions}
\end{document}
该\question
命令用于将文本放入mdframed
。由于它是使用 声明的\newcommand
,因此无法直接传入任何逐字环境。使用verbatimbox
不是一个选项,因为我需要 的语法突出显示listings
。
问题是,生成的文本似乎是垂直对齐在顶部而不是底部:
我可以以某种方式自动对齐所有内容吗?我知道\raisebox
存在,但我需要以某种方式了解高度差异。
答案1
我无法重现您的图像。但是,boxpos=t
应该是您想要的:
\documentclass{article}
\usepackage{listings}
\lstset{boxpos=t}
\begin{document}
\begin{lrbox}{0}
\begin{lstlisting}[language=C]
int* p = (int*) malloc(100 * sizeof(int));
\end{lstlisting}
\end{lrbox}
Explain what \usebox{0}; does.
\begin{lrbox}{0}
\begin{lstlisting}[language=C]
SWAP(t, x, y)
\end{lstlisting}
\end{lrbox}
Define a macro SWAP\usebox{0} that exchanges two arguments of type t.
\end{document}
我添加了文本来强调输出的正确性。
另一方面,\lstinline
似乎容易得多。
\documentclass{article}
\usepackage{listings}
\begin{document}
Explain what \lstinline[language=C]{int* p = (int*) malloc(100 * sizeof(int));}
does.
Define a macro \lstinline[language=C]{SWAP(t, x, y)}
that exchanges two arguments of type t.
\end{document}