12

I'm writing a lecture with many source codes for example. The codes are stored in severus different files. I use listing and minted packages for formatting the sources.

I would like add character at the begin of every line of some codes like:

  • Bash shell ($ or #)
  • Python shell (>>>)
  • Matlab (>>)
  • Other shells (>)

I tried some solutions which have given on:

But both solutions have the same problem when I try:

\begin{foo_environment} 
    \input{bar.txt} 
\end{foo_environment}

In both solutions the linebreaking are ingnored

I have tried executing a bash command:

sed 's/^/$ /' bar.sh > bar.txt

This works locally but I can't do the same in Overleaf and Sharelatex

This is a sample code bar.sh:

cd ..
mount /dev/sda3 /mnt/
cd ~/.ssh/
ll
cd ~
ls -al

The result must be:

$ cd ..
$ mount /dev/sda3 /mnt/
$ cd ~/.ssh/
$ ll
$ cd ~
$ ls -al

3 Answers3

10

With listings you can redefine the numberstyle:

\documentclass{article}
\usepackage{listings}

\lstset{
  language=tex,
  basicstyle=\footnotesize\ttfamily\selectfont,
  keepspaces=true,
  numbers=left,
  numbersep=5pt,
  numberstyle=\numberwithprompt,
}

\newcommand{\lstprompt}{>>>}
\newcommand\numberwithprompt[1]{\footnotesize\ttfamily\selectfont#1 \lstprompt}


\begin{document}
\begin{lstlisting}
a
b
c
\end{lstlisting}
\end{document}

enter image description here

Ulrike Fischer
  • 327,261
6

minted.sty uses fancyvrb.sty to typeset the minted environments. fancyvrb.sty provides a macro named \FancyVerbFormatLine to change individual line formatting. You can define your own macro for your environment and plug it into minted with the formatcom key. Code:

\documentclass{article}

\usepackage{minted}

\newcommand{\BashFancyFormatLine}{%
  \def\FancyVerbFormatLine##1{\$\,##1}%
}

\begin{document}

\noindent Some Text
\begin{minted}[formatcom=\BashFancyFormatLine]{bash}
cd ..
mount /dev/sda3 /mnt/
cd ~/.ssh/
ll
cd ~
ls -al
\end{minted}
some text

\end{document}

enter image description here


You can apply the same procedure to external files by using \inputminted:

\documentclass{article}

\usepackage{minted,filecontents}

\begin{filecontents*}{bash.sh}
cd ..
mount /dev/sda3 /mnt/
cd ~/.ssh/
ll
cd ~
ls -al
\end{filecontents*}

\newcommand{\BashFancyFormatLine}{%
  \def\FancyVerbFormatLine##1{\$\,##1}%
}

\begin{document}

\noindent Now read the same code from a file:
\inputminted[formatcom=\BashFancyFormatLine]{bash}{bash.sh}

\end{document}
Arash Esbati
  • 7,416
3

With listings you can hook into the line numbering code. This approach is fine if you don't put \labels in your code -- I never have and didn't even know you could -- but if you do, when you refer to the line numbers they will be followed by whatever prompt text you define. In that case see Ulrike Fischer's answer.

Here's an example, which defines a "prompt" (\lstprompt) as ">>>" (python style) in line 13 and applies it in line 14.

\documentclass{article}
\usepackage{listings}

\lstset{ 
  language=tex,
  basicstyle=\footnotesize\ttfamily\selectfont,
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                   
  numberstyle=\footnotesize\ttfamily\selectfont\,
} 

\newcommand{\lstprompt}{>>>}
\renewcommand*\thelstnumber{{\the\value{lstnumber}}\lstprompt}
\begin{document}
    \lstinputlisting{lst_test.tex}
\end{document}

And the output (using the code above as a test case): output of above code

Of course you can insert spaces or otherwise tweak at will. Here's a $ sign with no numbering:

\newcommand{\lstprompt}{\$}
\renewcommand*\thelstnumber{\lstprompt}

bash style

Chris H
  • 8,705
  • Thank you for your help. I'm going to test your solution and next I'm goin to vote. – Adolfo Correa Nov 21 '16 at 14:18
  • I wouldn't redefine \thelstnumber -- it can also be used for references and the additional code would disturb this. – Ulrike Fischer Nov 21 '16 at 14:34
  • @UlrikeFischer having used listings without referring to line numbers -- in fact only to the (sub)section containing the listing -- it would seem reasonable in some cases to do this. I also considered whether the line number separator might provide a way in (which in many ways I would prefer. – Chris H Nov 21 '16 at 15:16
  • @UlrikeFischer now I know that putting labels inside your listings is even possible, I've added a note to the top of my answer commending yours for those who use such things. – Chris H Nov 21 '16 at 15:57