Como corrigir o seguinte novo comando?

Como corrigir o seguinte novo comando?

Estou declarando um novo comando da seguinte maneira:

\newcommand{\code}[2]{
\begin{listing}[ht]
\begin{minted}
[
framesep=2mm,
baselinestretch=1.2,
bgcolor=blue!30!white,
fontsize=\footnotesize,
]
{#1}
#2
\end{minted}
\end{listing}%$
}

Eu quero usar da seguinte forma:

\code{bash}{
sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev \
make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev  \
xvfb xorg-dev python-opengl libboost-all-dean v libsdl2-dev swig
}

Infelizmente, está gerando um erro.

Como devo corrigir isso?

Responder1

É muito mais simples se você usar um ambiente.

\documentclass{article}
\usepackage{minted}

\newenvironment{code}[2][]
 {%
  \VerbatimEnvironment
  \begin{listing}[htp]
  \begin{minted}[
    framesep=2mm,
    baselinestretch=1.2,
    bgcolor=blue!30!white,
    fontsize=\footnotesize,
    #1
  ]{#2}%
 }
 {\end{minted}\end{listing}}

\begin{document}

\begin{code}[breaklines]{bash}
sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev \
make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev  \
xvfb xorg-dev python-opengl libboost-all-dean v libsdl2-dev swig
\end{code}

\begin{listing}[htp]
\begin{minted}[
  framesep=2mm,
  baselinestretch=1.2,
  bgcolor=blue!30!white,
  fontsize=\footnotesize,
  ]{bash}
sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev \
make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev  \
xvfb xorg-dev python-opengl libboost-all-dean v libsdl2-dev swig
\end{minted}
\end{listing}

\end{document}

Mostrei como você pode adicionar opções ao mintedambiente no primeiro exemplo.

insira a descrição da imagem aqui

Responder2

Você pode criar um comando que leia as coisas literalmente e depois as passe \scantokenspara re-tokenização:

Posso oferecer uma macro \UDcollectverbargcom a seguinte sintaxe:

\UDcollectverbarg{⟨^^M-replacement⟩}{⟨Mandatory 1⟩}{⟨Mandatory 2⟩}⟨verbatimized argument⟩

que produz:

⟨Mandatory 1⟩{⟨Mandatory 2⟩{⟨verbatimized argument⟩}}

, com cada caractere ^^Mque denota o fim de uma linha sendo substituído pelo token-sequence ⟨^^M-replacement⟩.

Os argumentos obrigatórios são obrigatórios. Se eles consistirem em vários tokens, eles deverão ser aninhados em catcode-1/2-character-pair/braces.
Se for necessária leitura e tokenização, isso ocorrerá sob regime de código de categoria inalterado.
O literal-Arg também é obrigatório. Deve ser lido e tokenizado sob o regime de código de categoria literal. Se seu primeiro caractere for uma chave, será "assumido" que o argumento está aninhado entre chaves. Caso contrário, será assumido que o final desse argumento é delimitado pelo primeiro caractere - como o argumento de \verb.
As linhas vazias não serão ignoradas.

Eu escolhi esta sintaxe porque com ela você pode coletar argumentos literalizados dentro do segundo argumento obrigatório aninhando chamadas \UDcollectverbargdentro \UDcollectverbargdo primeiro argumento obrigatório.

Por exemplo,

\UDcollectverbarg{⟨^^M-replacement⟩}%
                 {\UDcollectverbarg{⟨^^M-replacement⟩}{\UDcollectverbarg{⟨^^M-replacement⟩}{⟨actionA⟩}}}%  <- Mandatory 1
                 {⟨actionB⟩}%                     <- Mandatory 2
                 ⟨verbatimized argument 1⟩⟨verbatimized argument 2⟩⟨verbatimized argument 3⟩

rendimentos:

\UDcollectverbarg{⟨^^M-replacement⟩}{\UDcollectverbarg{⟨^^M-replacement⟩}{⟨actionA⟩}}% <- Mandatory 1
                 {⟨actionB⟩{⟨verbatimized argument 1⟩}}%        <- Mandatory 2
                 ⟨verbatimized argument 2⟩⟨verbatimized argument 3⟩

rendimentos:

\UDcollectverbarg{⟨^^M-replacement⟩}{⟨actionA⟩}% <- Mandatory 1
                 {⟨actionB⟩{⟨verbatimized argument 1⟩}{⟨verbatimized argument 2⟩}}% <- Mandatory 2
                 ⟨verbatimized argument 3⟩

rendimentos:

⟨actionA⟩{⟨actionB⟩{⟨verbatimized argument 1⟩}{⟨verbatimized argument 2⟩}{⟨verbatimized argument 3⟩}}

Suponha ⟨actionA⟩= \@firstofone:

\@firstofone{⟨actionB⟩{⟨verbatimized argument 1⟩}{⟨verbatimized argument 2⟩}{⟨verbatimized argument 3⟩}}

rendimentos:

⟨actionB⟩{⟨verbatimized argument 1⟩}{⟨verbatimized argument 2⟩}{⟨verbatimized argument 3⟩}
%% Copyright (C) 2007 - 2019 by Ulrich Diez ([email protected])
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public Licence (LPPL), either
%% version 1.3 of this license or (at your option) any later
%% version. (The latest version of this license is in:
%% http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.)
%% The author of this work is Ulrich Diez.
%% This work has the LPPL maintenance status 'not maintained'.
%% Usage of any/every component of this work is at your own risk.
%% There is no warranty - neither for probably included
%% documentation nor for any other part/component of this work.
%% If something breaks, you usually may keep the pieces.

\errorcontextlines=10000

%%<-------------------- code for \UDcollectverbarg -------------------->
\makeatletter
%%......................................................................
%% Check whether argument is empty:
%%......................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is empty>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is not empty>}%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
  \romannumeral0\expandafter\@secondoftwo\string{\expandafter
  \@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
  \@secondoftwo\string}\expandafter\@firstoftwo\expandafter{\expandafter
  \@secondoftwo\string}\expandafter\expandafter\@firstoftwo{ }{}%
  \@secondoftwo}{\expandafter\expandafter\@firstoftwo{ }{}\@firstoftwo}%
}%
%%......................................................................
\begingroup
\catcode`\^^M=12 %
\@firstofone{%
  \endgroup%
  \newcommand\UDEndlreplace[2]{\romannumeral0\@UDEndlreplace{#2}#1^^M\relax{}}%
  \newcommand*\@UDEndlreplace{}%
  \long\def\@UDEndlreplace#1#2^^M#3\relax#4#5{%
    \UD@CheckWhetherNull{#3}%
    { #5{#4#2}}{\@UDEndlreplace{#1}#3\relax{#4#2#1}{#5}}%
  }%
}%
\newcommand\UDcollectverbarg[3]{%
  \@bsphack
  \begingroup
  \let\do\@makeother % <- this and the next line switch to
  \dospecials        %    verbatim-category-code-régime.
  \catcode`\{=1      % <- give opening curly brace the usual catcode so a 
                     %    curly-brace-balanced argument can be gathered in
                     %    case of the first thing of the verbatimized-argument 
                     %    being a curly opening brace.
  \catcode`\ =10     % <- give space and horizontal tab the usual catcode so
  \catcode`\^^I=10   %    \UD@collectverbarg cannot catch a space or horizontal
                     %    tab as its 4th undelimited argument.
                     %    (Its 4th undelimited argument denotes the verbatim-
                     %     syntax-delimiter in case of not gathering a
                     %     curly-brace-nested argument.)
  \kernel@ifnextchar\bgroup
  {% seems a curly-brace-nested argument is to be caught:
    \catcode`\}=2    % <- give closing curly brace the usual catcode also.
    \UD@collectverbarg{#1}{#2}{#3}{}%
  }{% seems an argument with verbatim-syntax-delimiter is to be caught:
    \do\{% <- give opening curly brace the verbatim-catcode again.
    \UD@collectverbarg{#1}{#2}{#3}%
  }%
}%
\newcommand\UD@collectverbarg[4]{%
  \do\ %             % <- Now that \UD@collectverbarg has the delimiter or
  \catcode`\^^I=12   %    emptiness in its 4th arg, give space and horizontal tab 
                     %    verbatim-catcode (again).
  \catcode`\^^M=12   % <- Give the carriage-return-character the verbatim-catcode.
  \long\def\@tempb##1#4{%
    \edef\@tempb{##1}%
    \@onelevel@sanitize\@tempb % <- Turn characters into their "12/other"-pendants.
                               %    This may be important with things like the 
                               %    inputenc-package which may make characters 
                               %    active/which give them catcode 13(active).
    \expandafter\UDEndlreplace\expandafter{\@tempb}{#1}{\def\@tempb}% <- this starts 
                               %    the loop for replacing endline-characters.
    \expandafter\UD@@collectverbarg\expandafter{\@tempb}{#2}{#3}% <- this "spits 
                               %    out the result.
  }%
  \@tempb
}%
\newcommand\UD@@collectverbarg[3]{%
  \endgroup
  \@esphack
  #2{#3{#1}}%
}%
\makeatother
%%<---------------- end of code for \UDcollectverbarg ----------------->

\documentclass{article}
\usepackage{minted}

% As a usage-example let's now define a macro \mintedcode which
% collects a verbatim-argument and wraps it into a listing- 
% and a minted-environment before passing it to \scantokens

\makeatletter
\newcommand\mintedcode[2][]{%
  \begingroup
  \def\@tempa{{#1}{#2}}%
  \@mintedcode
}%
\newcommand\@mintedcode[1][]{%
  \UDcollectverbarg{^^J}{\@firstofone}{%
    \expandafter\endgroup\expandafter\@@mintedcode\@tempa{#1}%
  }%
}%
\newcommand\@@mintedcode[1]{%
  \renewcommand\@@mintedcode[4]{%
    \scantokens{%
      \begin{listing}[htp]^^J
      \csname UD@CheckWhetherNull\endcsname{##1}{}{\caption{##1}}^^J
      \begin{minted}[framerule=0mm,
                     framesep=2mm,
                     frame=single,
                     rulecolor=\color{blue!30!white},
                     baselinestretch=1.2,
                     bgcolor=blue!30!white,
                     fontsize=\footnotesize,
                     ##3%
                    ]^^J%
      {##2}^^J##4^^J%
      #1^^J%
    }%
  }%
}%
\UDcollectverbarg{^^J}{\@firstofone}{\@@mintedcode}|\end{minted}
\end{listing}|

\makeatother

\begin{document}

\mintedcode[A caption]{bash}[breaklines=true]{
sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev \
make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev  \
xvfb xorg-dev python-opengl libboost-all-dean v libsdl2-dev swig
}%

\end{document}

insira a descrição da imagem aqui

informação relacionada