중괄호가 중첩된 LaTeX \newenvironment

중괄호가 중첩된 LaTeX \newenvironment

저는 비머 프리젠테이션을 만들고 있는데 터미널 스타일 상자에 터미널 명령을 표시하고 싶었습니다. tkiz를 사용하여 원하는 것을 만들었지만 지금은 전처리기 중괄호 불일치로 인해 이를 새로운 환경으로 정의하는 데 어려움을 겪고 있습니다. 여기에 환경으로 바꾸고 싶은 블록이 있습니다.

% Define box and box title style
\tikzstyle{terminal} = [draw=white, text=white, font=courier, fill=black, very thick,
    rectangle, inner sep=10pt, inner ysep=20pt]
\tikzstyle{terminalTitle} =[fill=black, text=white, draw=white]

    \begin{tikzpicture}
    \node [terminal] (box){      % 1: this
    \begin{minipage}{0.90\textwidth}
    \begin{lstlisting}
    $ python -c " print 'x'*80 + '\x01' " | ./test1
    Enter password:
    You win!
    $
    \end{lstlisting}
    \end{minipage}
    };                           % 2: matches this
    \node[terminalTitle, rounded corners, right=10pt] at (box.north west) {\texttt{tty1: /bin/bash}};
    \end{tikzpicture}

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

하지만 새로운 환경으로 만들려고 하면 전처리기가 중괄호 #2와 일치하고 오류가 발생합니다. 패키지를 사용해 보았는데환경이렇게:

\NewEnviron{terminal}{
\tikzstyle{terminal} = [draw=white, text=white, font=courier, fill=black, very thick,
    rectangle, inner sep=10pt, inner ysep=20pt]
\tikzstyle{terminalTitle} =[fill=black, text=white, font=\ttfamily, draw=white]

\begin{tikzpicture}
\node [terminal] (box){%
    \begin{minipage}{0.90\textwidth}
\begin{lstlisting}
\BODY
\end{lstlisting}
    \end{minipage}
};
\node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash}};
\end{tikzpicture}%
}

하지만 여전히 오류가 발생합니다. 이 환경에서 중첩된 중괄호를 벗어날 수 있는 방법이 있나요?

또한 전문은 다음과 같습니다.

\documentclass{article}

\usepackage{tikz}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{courier}
\usepackage{environ}

\usetikzlibrary{shapes}

\lstset{basicstyle=\ttfamily,breaklines=true}

답변1

코드가 이미 흡수된 경우에는 수행할 수 없는 방식으로 환경에서 코드를 처리해야 하기 때문에 lstlisting로 정의된 환경 내부에 숨는 것은 \NewEnviron실제로 작동하지 않습니다 .lstlisting\BODY

다음은 작동하는 버전입니다(거의 크기 문제를 해결해야 합니다).

\documentclass{article}

\usepackage{tikz}
\usepackage{listings}

\usetikzlibrary{shapes}

\lstset{basicstyle=\ttfamily,breaklines=true}
\newsavebox\terminalbox
\lstnewenvironment{terminal}[1][]
  {\lstset{#1}\setbox\terminalbox=\vbox\bgroup\hsize=0.7\textwidth}
  {\egroup
   \tikzstyle{terminal} = [
    draw=white, text=white, font=courier, fill=black, very thick,
    rectangle, inner sep=10pt, inner ysep=20pt
   ]
   \tikzstyle{terminalTitle} = [
     fill=black, text=white, font=\ttfamily, draw=white
   ]
   \begin{tikzpicture}
   \node [terminal] (box){\usebox{\terminalbox}};
   \node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash};
   \end{tikzpicture}
}

\begin{document}

\begin{terminal}
$ python -c " print 'x'*80 + '\x01' " | ./test1
Enter password:
You win!
$
\end{terminal}

\end{document}

더 나은 LaTeX 스타일은 을 사용 하지만 마음에 들지 않는 lrbox것으로 나타났습니다 .\lstnewenvironment

여기에 이미지 설명을 입력하세요

패키지 도 확인해보세요 tcolorbox.

답변2

답변해 주셔서 감사합니다. 귀하의 솔루션을 기반으로 graphicx 패키지의 resizebox를 사용하여 크기 문제를 해결하고 너비를 textwidth와 동일하게 만들었습니다. 이것을 사용하고 싶은 사람을 위해 여기에 게시하십시오. 또한 tcolorbox를 사용하여 동일한 작업을 수행하는 것이 더 쉬울 수 있지만 CTAN 패키지가 필요하지 않습니다.

\usepackage{graphicx}
\usepackage{listings}
\usepackage{color}
\usepackage{courier}
\usepackage{tikz}

\usetikzlibrary{shapes}

\lstset{basicstyle=\ttfamily\footnotesize,breaklines=true}
\newsavebox\terminalbox
\lstnewenvironment{terminal}[1][]
  {\lstset{#1}\setbox\terminalbox=\vbox\bgroup\hsize=0.8\textwidth}
  {\egroup
   \tikzstyle{terminal} = [
    draw=white, text=white, font=courier, fill=black, very thick,
    rectangle, inner sep=2pt, inner ysep=8pt
   ]
   \tikzstyle{terminalTitle} = [
     fill=black, text=white, font=\ttfamily, draw=white
   ]
   \noindent\resizebox{\textwidth}{!}{ % This line fits the box to textwidth
   \begin{tikzpicture}
   \node [terminal] (box){\usebox{\terminalbox}};
   \node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash};
   \end{tikzpicture}}
}

\begin{document}
    \begin{terminal}
    $ python -c " print 'x'*80 + '\x01' " | ./test1
    Enter password:
    You win!
    $
    \end{terminal}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보