Estou tentando obter algumas listagens e textos dentro de um ambiente tabularx, mas não parece muito bom:
Usei a sugestão emListagem dentro do tabularx?para adicionar os literais ^^J para fazer com que a coisa realmente seja compilada, mas o resultado parece horrível e o código não é melhor.
\begin{tabularx}{\linewidth}{l l X}\label{tab:peepholeex}
Original stack code & Optimised stack code & Notes \\ \toprule
\begin{lstlisting}^^J
SET 1^^J
ADD
\end{lstlisting} &
\begin{lstlisting}^^J
INC
\end{lstlisting} &
Take advantage of the J5's {\lstinline!INC!} instruction \\ \midrule
\begin{lstlisting}^^J
SET 1^^J
SUB
\end{lstlisting} &
\begin{lstlisting}^^J
DEC
\end{lstlisting} &
Same as above, but for subtraction \\ \midrule
\begin{lstlisting}^^J
SET 0^^J
TEQ^^J
DROP
\end{lstlisting} &
\begin{lstlisting}^^J
TSZ
\end{lstlisting} &
Generated with an {\lstinline!IFN, x, 0!} statement. Instead take advantage of
the {\lstinline!TSZ!} instruction of the J5 \\ \midrule
\begin{lstlisting}^^J
SET x^^J
STORE^^J
SET x^^J
LOAD
\end{lstlisting} &
\begin{lstlisting}^^J
DUP^^J
SET x^^J
STORE
\end{lstlisting} &
A store followed by an immediate load of the same value. Instead, duplicate the
stored value and just store (since it might be used elsewhere) \\
\end{tabularx}
Qual é a melhor maneira de fazer isso, para que não haja quebras de linha estranhas na terceira coluna? (E a melhor maneira de fazer isso de forma mais geral!)
Responder1
Proponho duas soluções (certamente não são as melhores, mas pode ser uma forma de chamar a atenção para a questão).
Primeiro: se você pode ficar sem listings
pacote, você pode definir um \newcolumntype
que usa \ttfamily
.
\documentclass{book}
\usepackage{capt-of}
\usepackage{booktabs}
\usepackage{tabularx}
\newcolumntype{L}{>{\ttfamily\arraybackslash}p{6em}}
\begin{document}
\captionof{table}{Some caption}\label{tab:peepholeex}\vspace{1ex}
\noindent
\begin{tabularx}{\linewidth}{LLX}
\normalfont\raggedright Original stack code & \normalfont\raggedright Optimised stack code & Notes \\
\toprule
SET 1\newline
ADD
&
INC
&
Take advantage of the J5's \texttt{INC} instruction \\ \midrule
SET 1\newline
SUB
&
DEC
&
Same as above, but for subtraction \\ \midrule
SET 0\newline
TEQ\newline
DROP
&
TSZ
&
Generated with an \texttt{IFN, x, 0} statement. Instead take advantage of
the \texttt{TSZ} instruction of the J5 \\ \midrule
SET x\newline
STORE\newline
SET x\newline
LOAD
&
DUP\newline
SET\newline
STORE
&
A store followed by an immediate load of the same value. Instead, duplicate the
stored value and just store (since it might be used elsewhere) \\
\end{tabularx}
\end{document}
Segundo: se você não pode ficar sem listings
pacote, aqui está uma solução (muito) suja com \raisebox
.
\documentclass{book}
\usepackage{ragged2e}
\usepackage{capt-of}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{listings}
\newlength{\myup}
\begin{document}
\settoheight{\myup}{\vbox{\texttt{X}}}
\addtolength{\myup}{1.5pt}
\captionof{table}{Some caption}\label{tab:peepholeex}\vspace{1ex}
\noindent
\begin{tabularx}{\linewidth}{llX}
Original stack code & Optimised stack code & Notes \\[.5ex] \toprule
\begin{lstlisting}^^J
SET 1^^J
ADD
\end{lstlisting} &
\raisebox{\myup}{%
\begin{lstlisting}^^J
INC
\end{lstlisting}
}\rule[0pt]{0pt}{2.5\myup} &
\raisebox{\myup}{%
\parbox[t][2\myup][t]{13em}{\justifying\noindent
Take advantage of the J5's {\lstinline!INC!} instruction
}} \\[2ex]
\midrule
\begin{lstlisting}^^J
SET 1^^J
SUB
\end{lstlisting} &
\raisebox{\myup}{%
\begin{lstlisting}^^J
DEC
\end{lstlisting}
}\rule[0pt]{0pt}{2.5\myup} &
\raisebox{\myup}{%
\parbox[t][2\myup][t]{13em}{\justifying\noindent
Same as above, but for subtraction
}} \\[2ex] \midrule
\begin{lstlisting}^^J
SET 0^^J
TEQ^^J
DROP
\end{lstlisting} &
\raisebox{2\myup}{%
\begin{lstlisting}^^J
TSZ
\end{lstlisting}
} &
\raisebox{1.8\myup}{%
\parbox[t][4\myup][t]{13em}{\justifying\noindent
Generated with an {\lstinline!IFN, x, 0!} statement. Instead take advantage of
the {\lstinline!TSZ!} instruction of the J5
}}\\[5.5ex]
\midrule
\begin{lstlisting}^^J
SET x^^J
STORE^^J
SET x^^J
LOAD
\end{lstlisting} &
\raisebox{.8\myup}{%
\begin{lstlisting}^^J
DUP^^J
SET x^^J
STORE
\end{lstlisting}
}\rule[0pt]{0pt}{4.2\myup} &
\raisebox{2.5\myup}{%
\parbox[t][4\myup][t]{13em}{\justifying\noindent
A store followed by an immediate load of the same value. Instead, duplicate the
stored value and just store (since it might be used elsewhere)
}} \\
\end{tabularx}
\end{document}