0

I'm not a Latex expert, so I reached the limit of my knowledge in the tracking down of this problem. If someone can shed some light into this problem I think it would be very useful.

The Problem Description (applicable on Windows, see environment bellow: When using \newtcbinputlisting from \tcolorbox with minted library, IF the file name has Spaces and/or underscores, the end result and/or compilation may fail or have unexpected behavior. The problem has variants if single or multiple snippets of SAME file are used. I will present some of tested conditions... but others may (probably) exist.

The Environment: I'm running Windows 10 Education, 64-bit, build 17134; MiKTeX: 2.9.6930; minted 2.5; tcolorbox 4.15.

Setup of MWE: To have a MWE use the code bellow saved as minimal.tex. Then use the following batch-file (see bellow) to create all required files (It's just multiple copies of minimal.tex)

How to run and Identify the problem:

  1. (OPTIONAL) Uncomment section with \inputminted command; COMMENT section with \setCode command. 1.a - RESULT: You should see eight listings with NO problem. (I think that this ensures that the problem Is Not from minted package. Do you agree?)
  2. IMPORTANT: Delete directory "_minted-minimal" (the minted cache) if you run the Step 1.
  3. IMPORTANT: Comment ALL \inputminted if you run Step 1.
  4. Comment \setCode for Code 1a to Code 4a (the last four). 4.a - RESULT: You should see FOUR listings, with NO Problems. 4.b - VARIANT WITH PROBLEMS: As you can see in title, the use OR not of double quotes is important... and is dependent of the existence or not os spaces/underscores in the file name. Adding/removing the double quotes changes the result. As a "general" rule, filenames WITH spaces MUST have quotes, while WITHOUT space MUST NOT have quotes. (Should check if filename has space... and add double quotes?)
  5. IMPORTANT: Delete directory "_minted-minimal" (the minted cache). This ensures a "Fresh" start for next Scenario: More than one snippet per-source file.
  6. Uncomment \setCode for Code 1a to Code 4a (the last four). 4.a - RESULT: The document is produced, but: A Python error (see bellow) is issued. In Code 6 the missing double quotes creates an "artifact" in the listing (the remainder of the file name after the space).

Things to be Aware: To fully understand the problem several test must be made by adding/removing double quotes for each situation. Since the "delicateness" of results vs input/start conditions, some key aspect MUST be checked:

  • (MOST IMPORTANT) Having or Not the minted cache (_minted-minimal directory) at compilation time INFLUENCES the result, so BE SURE to remove it to test Insertion of FIRST Snippet.
  • Note that a Space-after-Underscore produce a DIFFERENT result that Underscore-after-Space.
  • Note that Same-FILE snippets MAY produce Python error (depending on double quotes use!!)
  • As an additional complication... notice that underscore Is Never escaped... BUT... if \underscore package is used... only the THREE LAST Code snippets are produced on First compilation... AND FOUR afterwards...

Related/Duplicate I have found some potential duplicate/related (in the sense that the root cause may be the same!?) and I even submitted a bug on tcolorbox (now closed... because in fact double quote sometimes overcome the problem). enter link description here Listing of a file with underscores in its name/path Problems setting up minted and tcolorbox to include source code and set title Have just the file name show up in a listing environment

Batch file for setup

mkdir lst
copy minimal.tex "./lst/mintsn_iptest.tex.01"
copy minimal.tex "./lst/mints niptest.tex.01"
copy minimal.tex "./lst/mints n_iptest.tex.01"
copy minimal.tex "./lst/mints_n iptest.tex.01"

copy minimal.tex "./lst/sn_iptest.tex.01"
copy minimal.tex "./lst/s niptest.tex.01"
copy minimal.tex "./lst/s n_iptest.tex.01"
copy minimal.tex "./lst/s_n iptest.tex.01"

The Python error

Process started: pdflatex.exe -synctex=1 -interaction=nonstopmode -shell-escape "minimal".tex

File "<string>", line 1 import sys; import os; import textwrap; from io import open; fname = os.path.expanduser(os.path.expandvars(""./lst/sn_iptest.tex.01"")); f = open(fname, "r", encoding="UTF8") if os.path.isfile(fname) else None; t = f.readlines() if f is not None else None; t_opt = t if t is not None else []; f.close() if f is not None else None; tmpfname = os.path.expanduser(os.path.expandvars("minimal.pyg")); f = open(tmpfname, "w", encoding="UTF8") if t is not None else None; fvstartnum = 10; fvstopnum = 15; s = fvstartnum-1 if fvstartnum != 0 else 0; e = fvstopnum if fvstopnum != 0 else len(t_opt); [f.write(textwrap.dedent("".join(x))) for x in (t_opt[0:s], t_opt[s:e], t_opt[e:]) if x and t is not None]; f.close() if t is not None else os.remove(tmpfname); ^ SyntaxError: invalid syntax

The MWE (Also used as external listing file... renamed)

\documentclass{article}

% General settings
\usepackage[utf8]{inputenc}     % Input encoding
\usepackage[T1]{fontenc}        % Output encoding
%\usepackage{underscore}

%===============================================================================
% Source Code Style using mint package and tcolorbox package
%   Preamble Setting for Code Listings using {tcolorbox} and {minted} packages
\usepackage{varwidth}
\usepackage[minted,skins,breakable]{tcolorbox}  % tcolorbox with extra packages
\usetikzlibrary{shadings}

\newtcbinputlisting[auto counter, number within=chapter, list inside=srccode,
number freestyle={\noexpand\textbf{Code \noexpand\thechapter.\noexpand\arabic{\tcbcounter}}:}]
{\setCode}[4][]{% Options for the listings (Seven parameters- NO defaults)
    minted options={fontsize=\footnotesize, autogobble, %outputdir=./aux-files/, 
        breaklines, breakanywhere, style=emacs, linenos, #1},
    minted language = tex,
    title ={\textbf{\thetcbcounter} #3},
    listing file = {#2},
    label = {#4},
    listing only,
}

\newcommand{\separator}{\noindent\rule{8cm}{0.4pt}}

\begin{document}

    Start document here with something simple:
    % No spaces

    First... a control sequence (Optional).

    Use minted directly. NOTE the (Required) use of - "".

%   \separator  
%   \inputminted[firstline=5, lastline=10]{tex}{"./lst/mintsn_iptest.tex.01"}
%   \separator
%   \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints niptest.tex.01"}
%   \separator
%   \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints n_iptest.tex.01"}
%   \separator
%   \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints_n iptest.tex.01"}
%   \separator  \par
%   Now a Second Snippet of same files. \par
%   \separator
%   \inputminted[firstline=10, lastline=15]{tex}{"./lst/mintsn_iptest.tex.01"}
%   \separator
%   \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints niptest.tex.01"}
%   \separator
%   \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints n_iptest.tex.01"}
%   \separator
%   \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints_n iptest.tex.01"}
%   \separator


    The above code DOES NOT work WITHOUT the "". --- > No problems Here.

    Now with TColorbox.

    \textbf{ENSURE minted cache is CLEARED...}. Delete the directory \_minted-project.

    Add/Remove double quotes on file names to see different behaviors.


    \setCode[firstline=5, lastline=10]{./lst/sn_iptest.tex.01}{UND. Only: CANNOT Have quotes}{Code:1}

    \setCode[firstline=5, lastline=10]{"./lst/s niptest.tex.01"}{SPACES: WITH Quotes-OK; WITHOUT-'tail' after first space printed in listing}{Code:2}

    \setCode[firstline=5, lastline=10]{"./lst/s n_iptest.tex.01"}{Space-Underscore: MUST HAVE Quotes}{Code:3}

    \setCode[firstline=5, lastline=10]{"./lst/s_n iptest.tex.01"}{Underscore-Space:  WITH Quotes-OK; WITHOUT-'tail' after first space printed in listing}{Code:4}

    Now a second snippet of same files.

    \setCode[firstline=10, lastline=15]{"./lst/sn_iptest.tex.01"}{UND. Only: MAY have Quotes but Python Error on FIRST compile}{Code:1a}

    \setCode[firstline=10, lastline=15]{./lst/s niptest.tex.01}{SPACES: WITH Quotes-Python Error on FIRST compile (but completes ok); WITHOUT-'tail' after first space printed in listing}{Code:2a}

    \setCode[firstline=10, lastline=15]{"./lst/s n_iptest.tex.01"}{Space-Underscore: MUST HAVE Quotes, BUT Python Error on FIRST compile (but completes ok)}{Code:3a}

    \setCode[firstline=10, lastline=15]{"./lst/s_n iptest.tex.01"}{Underscore-Space:  WITH Quotes-Python Error on FIRST compile (but completes ok); WITHOUT-'tail' after first space printed in listing}{Code:4a}

    End document Here.

\end{document}
  • 1
    Well I would avoid spaces at all costs. Underscores should normally work, if not then make a shorter example that demonstrates the problem. – Ulrike Fischer Feb 11 at 14:43
  • Spaces in file names are ugly. – user31729 Feb 11 at 16:38
  • The goal of this question is to try to identify a problem (that I think is) on tcolorbox package... which is a quite important one. Regarding spaces (and underscores)... unfortunately filenames and paths have it... I can (and... to overcome the problem do it) rename the files, but that is manageable only for a handful of files and quite prone to errors. Finally... it is always better to solve a problem that find a path to go around. – acombo Feb 12 at 8:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.