
Ich möchte einen Befehl erstellen, um die Verwendung des Befehls lstinputlisting
aus den Paketlisten zu vereinfachen, der einen einzelnen Parameter als Dateipfad akzeptieren und ihn sowohl an den Beschriftungs- als auch an den Pfadparameter von lstinputlisting übergeben kann. Mit einem Wort: Verwenden Sie den Dateipfad als Beschriftung.
Betrachten Sie die folgende LaTeX-Quelle:
\documentclass[UTF8]{ctexart}
\usepackage{listings}
\newcommand{\myincludecode}[1]{\lstinputlisting[caption=#1, language=matlab]{#1}}
\newcommand{\mysecondincludecode}[2]{\lstinputlisting[caption={#2}, language=matlab]{#1}}
\begin{document}
\myincludecode{main.m} % line 10
\myincludecode{gen_data.m} % line 11
\mysecondincludecode{main.m}{main.m} % line 13
\mysecondincludecode{gen_data.m}{gen\_data.m} % line 14
\end{document}
Offensichtlich funktionieren die Befehle in Zeile 13 und 14 gut. Sie schließen die entsprechende Datei korrekt ein und drucken die entsprechenden Beschriftungen.
Zeile 10 funktioniert auch einwandfrei. Zeile 11 bindet die entsprechende Datei jedoch ein, gibt aber keine Überschrift aus. In der Logdatei steht:
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Extra }, or forgotten $.
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Missing } inserted.
Es ist offensichtlich, dass der Unterstrich meinen Befehl zerstört. Ich frage mich also, wie ich ihn ändern kann, myincludecode
damit er funktioniert – auch bei einigen Sonderzeichen, wie hier dem Unterstrich.
Antwort1
Antwort2
Der mathmode
Unterstrich hat eine Funktion. Er ändert das nächste Zeichen in einen Index. Daher erwartet er ein $
Vorzeichen. Dies ist eine einfache Lösung für Ihr Problem.
\documentclass[UTF8]{ctexart}
\usepackage{listings}
\begin{document}
\begingroup
\newcommand{\myincludecode}[1]{\catcode`_=11\lstinputlisting[caption=#1, language=matlab]{#1}}
\myincludecode{main.m}
\myincludecode{gen_data.m}
\endgroup
$1_2$
\end{document}
Catcode bedeutet Kategoriecode. Die Kategorie von _
ist 8, was ihr eine Funktion zuweist. Wenn ich sie auf 11 ändere, wird der Unterstrich in eine Buchstabenkategorie geändert, was wahrscheinlich das ist, was Sie wollen. Wenn Sie diesen Befehl zwischen \begingroup
& einfügen \endgroup
, bleibt die Indexfunktion außerhalb ihres Gültigkeitsbereichs intakt.
Antwort3
Sie müssen „_“ in Dateinamen und in Zitat- oder Referenz-Tags vermeiden, oder Sie müssen das Babel-Paket mit seinen Aktivzeichen-Steuerelementen verwenden, oder Sie müssen die Option [strings] angeben, die versucht, mehrere Befehle neu zu definieren (und möglicherweise nicht perfekt funktioniert). Auch ohne die Option [strings] oder Babel können Sie gelegentlich Unterstriche verwenden, wie: „\include{file\string_name}“.
Die Standardoperation ist recht einfach und muss nicht angepasst werden. Sie müssen jedoch die Verwendung von „_“ an allen Stellen vermeiden, an denen LaTeX ein Argument als Zeichenfolge für eine Steuerfunktion oder als Namen verwendet. Dazu gehören die Tags für \cite und \ref, Dateinamen für \input, \include und \includegraphics, Umgebungsnamen, Zählernamen und Platzierungsparameter (wie [t]). Das Problem bei diesen Kontexten besteht darin, dass es sich um „bewegliche Argumente“ handelt, LaTeX jedoch den „\protect-Mechanismus“ für sie nicht „einschaltet“.
Wenn Sie an diesen Stellen den Unterstrich verwenden müssen, können Sie mit der Paketoption [strings] Befehle, die ein solches String-Argument annehmen, neu definieren, sodass der Schutz angewendet wird (wobei \protect zu \string gemacht wird). Die Liste der Befehle, die von dieser Bestimmung betroffen sind, finden Sie in \UnderscoreCommands, mit \do vor jedem Befehl; außerdem gibt es mehrere andere, die \input, \includegraphics, \cite, \ref und deren Varianten abdecken.
Bitte beachten Sie--http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf Und--Auflistung einer Datei mit Unterstrichen im Namen/Pfad