Search code examples
latexpdflatex

How to define block custom command in latex


I'm using overleaf, I want to create a \codewithcustom command that will be used like

\codewithcustom{cpp}{some caption}{
 int a[10];
}

but I always get fancy verb error. Can you please help me convert the code-block syntax into easier custom command? Also, here's a minimal reproducible example.

\documentclass{article}
\usepackage{minted}
\usepackage{xcolor}
\usepackage{caption}
\usepackage{xparse}
\definecolor{LightGray}{gray}{0.98}

% Global minted settings
\setminted{frame=none, 
breaklines=true,
framesep=5mm,
fontsize=\large,
baselinestretch=1.2,
bgcolor=LightGray,
tabsize=2,
linenos}


\title{C++ \& Python Personal Notes}
\author{Rakesh Shrestha}
\date{January 2025}
\begin{document}
\maketitle

\section{Vectors \& raw Arrays}
\subsection{Initialization}

% I want to create this to be used as a custom command
\begin{listing}[!ht]
\begin{minted}{cpp}
vector<vector<int>> bucket(maxFreq + 1);
for(const auto& a: hmap){
    bucket[a.second].push_back(a.first);
}
\end{minted}
\caption{Initialize empty elements with specified size in vectors}
\label{listing: 1}
\end{listing}

\begin{listing}[!ht]
\begin{minted}{cpp}
vector<vector<int>> bucket(10, 2);
\end{minted}
\caption{Initialize specified vectors with data}
\end{listing}


\end{document}

What I tried,

\newcommand{\codewithcaption}[3]{
  \begin{listing}
    \begin{minted}{#1}
     #3 
    \end{minted}}
    \caption{#2}
   \end{listing

Solution

  • Using fragile material, like verbatim code, in the argument of a macro isn't the best of ideas. Better use an environment:

    \documentclass{article}
    \usepackage{listings}
    \usepackage{xcolor}
    \definecolor{LightGray}{gray}{0.98}
    
    \usepackage[many]{tcolorbox}
    \tcbuselibrary{minted}
    
    \AtBeginDocument{
      \newtcblisting[blend into=listings]{codewithcustom}[2]{
        listing engine=minted,
        minted language=#1,
        title=#2,
        detach title,
        coltitle=black,
        listing and comment,
        comment=\centering\tcbtitle,
        oversize,
        enhanced,
        interior hidden,
        frame hidden,
        segmentation hidden,
        minted options={
            breaklines=true,
            framesep=5mm,
            fontsize=\large,
            baselinestretch=1.2,
            bgcolor=LightGray,
            tabsize=2,
            linenos
        }
      }
    }
    
    \begin{document}
    
    \begin{codewithcustom}{cpp}{Initialize empty elements with specified size in vectors}
    vector<vector<int>> bucket(maxFreq + 1);
    for(const auto& a: hmap){
        bucket[a.second].push_back(a.first);
    }
    \end{codewithcustom}
    
    
    \begin{codewithcustom}{cpp}{Initialize empty elements with specified size in vectors}
    vector<vector<int>> bucket(maxFreq + 1);
    for(const auto& a: hmap){
        bucket[a.second].push_back(a.first);
    }
    \end{codewithcustom}
    
    
    \end{document}
    

    enter image description here