Wie kann ich den Eingabebefehl anweisen, Sonderzeichen (wie im Verbmodus) zu ignorieren?

Wie kann ich den Eingabebefehl anweisen, Sonderzeichen (wie im Verbmodus) zu ignorieren?

Ich verwende die folgende Zeile, um den Namen des Git-Repositorys mit dem Quellcode des Dokuments in das PDF zu schreiben:

\input|"git config --get remote.origin.url | xargs basename"

Ich habe ein Problem mit einem Repository, dessen Name einen Unterstrich enthält, z. B. repo_name, da das Sonderzeichen meinen Compiler dazu veranlasst, in den Mathematikmodus zu wechseln.

Ich könnte wahrscheinlich die \catcodewie in der gezeigtenandere Antwort, aber es ist nicht nur der Unterstrich, der Probleme verursachen kann, und ich würde es lieber robust gegenüber allen Sonderzeichen machen, die in Verzeichnisnamen vorkommen können.

Antwort1

Sie können Folgendes verwenden catchfile:

\documentclass{article}
\usepackage{catchfile}

\begin{document}

\CatchFileDef\repository{|"kpsewhich eng_rs.sty | xargs basename"}{\catcode`_=12 }

\texttt{\repository}

\texttt{\meaning\repository}

\end{document}

Ich habe nur als Beispiel einen Dateinamen mit Unterstrich verwendet.

Bildbeschreibung hier eingeben

Eine möglicherweise bessere Version mit xparse:

\documentclass{article}
\usepackage[T1]{fontenc}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\getfilename}{O{}mo}
 {
  % #1 = optional list of characters to be made printable
  % #2 = variable part
  % #3 = optional command to save the returned token list in
  \tl_set_from_file:Nnn \l_maciek_filename_tl
   {
    \maciek_filename_setother:n { #1 }
   }
   {
    |"#2"
   }
  \IfValueTF{#3}
   {
    \tl_clear_new:N #3
    \tl_set_eq:NN #3 \l_maciek_filename_tl
   }
   {
    \tl_use:N \l_maciek_filename_tl
   }
 }

\cs_new_protected:Nn \maciek_filename_setother:n
 {
  \tl_map_function:nN { #1 } \char_set_catcode_other:N
 }

\ExplSyntaxOff

\begin{document}

\getfilename[_]{kpsewhich eng_rs.sty | xargs basename}

\getfilename[_]{kpsewhich eng_rs.sty | xargs dirname}[\foo]

\meaning\foo

\getfilename[\%]{ls | grep b}

\getfilename[\%_]{ls | grep y}

\end{document}

Ich habe zwei Dateien erstellt a%b.tex, a_x%y.texum nur die Verwendung des ersten optionalen Arguments zu zeigen. Ein Backslash wird für Zeichen wie Backslash, Prozent und Raute ( #) benötigt.

Bildbeschreibung hier eingeben

verwandte Informationen