我知道这是一个奇怪而愚蠢的问题,但我确实需要实现这一点。
我有一个文件,其中包含一些字符,例如“#”,“_”。例如,该文件是:
abc_def#gh
我需要输入(或将文件显示到 pdf 中)到 latex,而无需使用外部包就像verbatim
。只需使用内置的 latex 即可实现这一点。
我需要某种函数来替换特殊字符或以\verb
样式显示它而不会出现任何错误。
一些限制
- 我也无法在 latex 中运行 Bash 脚本。因为
-no-shell-escape
。 - 无法通过
\usepackage
命令使用外部包
答案1
如果您不想使用 LaTeX 软件包,那么以下解决方案根本不需要 LaTeX。这里只使用 TeX 基元和 Plain TeX 基本宏。但该解决方案在 LaTeX 中也有效,因为提到的 Plain TeX 宏\dospecials
和\obeylines
也在\obeyspaces
LaTeX 内核中实现。
\def\inputverbatim #1{\bgroup
\def\do##1{\catcode`##1=12 }\dospecials
\def\par{\endgraf\noindent\null}\obeylines\obeyspaces
\tt \noindent
\input{#1}
\egroup
}
%%% test:
\inputverbatim {file.txt}
答案2
很难理解为什么你不能使用\verbatiminput
但如果myfile2
有
line 1
abc_def#gh
line 3
$$$$$$
line 5
然后
\documentclass{article}
\makeatletter
\edef\qqq#1{%
\noexpand\begin{verbatim}
\noexpand\input{#1}%
\@backslashchar end\string{verbatim\string}}
\makeatother
\begin{document}
\qqq{myfile2}
\end{document}
但是如果verbatim.sty
无法使用,article.cls
也不应该可用,两者都是核心 latex 版本的一部分。所以我不明白任何 latex 文档如何工作。
答案3
我建议listingsutf8
按如下方式打包和使用它:
\lstinputlisting[输入编码=utf8/cp1250,框架=hnone,数字=none,扩展字符=true]{source.txt}
第二种选择是使用\detokenize
类似命令
\detokenize{abc_def\#gh}
但正如您所见,# 必须用反斜杠引起来。
答案4
我可能会这样做:
%-----------------------------------------------------------------
% Let's create an external text file SomeFile.tex which is to be
% input verbatim:
%-----------------------------------------------------------------
\begin{filecontents*}{SomeFile.tex}
Line 1: abc_def#gh
Line 2: $$$_def#gh
Line 3: %%%_def#gh
\end{verbatim}
Line 7: bla~~~bla
\end{filecontents*}
%-----------------------------------------------------------------
\documentclass{article}
\newcommand\Exchange[2]{#2#1}
\begin{document}
Text
\Exchange{\input{SomeFile.tex}}{\begin{verbatim}}\end{verbatim}
Text
\end{document}
如果你不希望以打字机模式排版,而只是希望 TeX 将特殊字符视为在排版时出现在文本中的普通字符,你可以尝试如下操作:
%-----------------------------------------------------------------
% Let's create an external text file SomeFile.tex which is to be
% input:
%-----------------------------------------------------------------
\begin{filecontents*}{SomeFile.tex}
Line 1: $&#^_~%\{}
Line 2: $&#^_~%\{}
\end{filecontents*}
%-----------------------------------------------------------------
\documentclass{article}
\makeatletter
\@ifdefinable\secondwhentypesetting{\protected\def\secondwhentypesetting#1#2{#2}}
\newcommand\unexpandedwhennottypesetting[1]{\noexpand\unexpandedwhennottypesetting{\unexpanded{#1}}}
\DeclareRobustCommand\myactivateasnospecial{\@dblarg\@myactivateasnospecial}%
\newcommand\@myactivateasnospecial[2][]{%
\begingroup\lccode`\~=`#2\relax
\lowercase{\endgroup\def~}{\secondwhentypesetting\unexpandedwhennottypesetting{#1}}%
\catcode`#2=13\relax
}%
\makeatother
\DeclareRobustCommand\TypesetFileWithSpecialsAsOrdinaryCharacters[1]{%
\begingroup
% switch special characters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\let\do=\myactivateasnospecial
\do\$%
\do\&%
\do\#%
\do[\ifmmode\hat{}\else\textasciicircum\fi]\^%
\do[\ifmmode\_\else\textunderscore\fi]\_%
\do[\ifmmode\sim\else\textasciitilde\fi]\~%
\do\%%
\do[\csname\ifmmode\else text\fi backslash\endcsname]\\%
\do\{%
\do\}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\input{#1}%
\endgroup
}%
\begin{document}
\TypesetFileWithSpecialsAsOrdinaryCharacters{SomeFile.tex}
$$\TypesetFileWithSpecialsAsOrdinaryCharacters{SomeFile.tex}$$
\end{document}