我怎样才能写入%
辅助文件?%
不起作用,因为 LaTeX 认为我用它来开始注释(在主文件中,而不是在辅助文件中!),并且\%
会写入\%
文件。如何实现?
\documentclass{article}
\begin{document}
\newwrite\outfile
\immediate\openout\outfile=example.dat
\immediate\write\outfile{%}% will not work, of course, but neither \%
\immediate\closeout\outfile
\end{document}
答案1
有\@percentchar
一个扩展为文字%
字符。您需要将写入操作括在一\makeatletter
\makeatother
对中
\makeatletter
\newwrite\outfile
\immediate\openout\outfile=example.dat
\immediate\write\outfile{\@percentchar}
\immediate\closeout\outfile
\makeatother
另一种逃避的方法%
是受到一个例子的启发
git log -1 --pretty=format:"%h-%ad" --date=short > /tmp/temp.dat
需要传递给\write18
\makeatletter
\newcommand\dosystem{%
\@ifstar{\@tempswafalse\do@system}{\@tempswatrue\do@system}%
}
\newcommand\do@system[1]{%
\begingroup
\let\%\@percentchar
\if@tempswa\expandafter\immediate\fi
\write18{#1}%
\endgroup
}
\makeatother
因此上面的命令可以通过以下方式执行
\dosystem{git log -1 --pretty=format:"\%h-\%ad" --date=short > /tmp/temp.dat }
由于未执行,因此下次发货时会延迟\dosystem*
。\write
\immediate
可以使用相同的想法转义其他字符,添加其他\let
指令。如果还需要括号和#
,则扩展定义如下
\makeatletter
\newcommand\dosystem{%
\@ifstar{\@tempswafalse\do@system}{\@tempswatrue\do@system}%
}
\edef\@hashmark{\string#}\edef\@lbrace{\string{}\edef\@rbrace{\string}}
\newcommand\do@system[1]{%
\begingroup
\let\%\@percentchar
\let\#\@hashmark
\let\{\@lbrace
\let\}\@rbrace
\if@tempswa\expandafter\immediate\fi
\write18{#1}%
\endgroup
}
\makeatother
并且在参数中\#
,\{
也\}
可以用来转义这些字符。
答案2
使用\@percentchar
或,\charxxx
其中 xxx 是 % 的小数
答案3
正如其他答案所指出的,您需要以某种方式输出字符串%
。对于不使用 LaTeX 的用户,类似
\def\percentchar#1{}
\edef\percentchar{\expandafter\percentchar\string\%}
\percentchar
将生成一个可用于此目的的宏。(我使用了\percentchar
两次而不是定义“gobble”命令:只是为了避免“名称浪费”。无论如何,许多人都会设置此类东西。)因此,例如上面的
\immediate\write-1{\percentchar}
将写入%
日志文件。
另一种方法是修改类别代码%
\begingroup
\catcode`\%=12
\immediate\write-1{%}\relax
\endgroup
尽管这确实需要多加注意才能正确终止线路(例如,\relax
如果我们不能假设垂直模式,则需要上述操作)。
答案4
根据 Martin Scharrer 的评论,我阅读了他的新动词包。有了这个,可以实现以下功能:
\documentclass{article}
\usepackage{newverbs}
\Verbdef\verbpercent{%}
\begin{document}
\newwrite\outfile
\immediate\openout\outfile=example.dat
\immediate\write\outfile{\verbpercent}
\immediate\closeout\outfile
\end{document}
与使用相比\@percentchar
:
优点:
\Verbdef
通常可以用于任何逐字文本,并且不需要\makeatletter \makeatother
。缺点:它使用了更多的 TeX 内存和更多的时间来编译(两者:稍微),并且理论上包 newverbs 和其他包之间可能存在不兼容。
(因此我使用\@percentchar
,但参考该newverbs
包对于一般情况肯定是有用的。)
作为用户202729在 2023 年 5 月 20 日的评论中指出,在足够新的 LaTeX 版本中,此解决方案会中断:如何将标签符号 # 写入输出文件?。自 2018/12/01 起,LaTeX 提供命令\protected@file@percent
。如果 example.dat 未使用 LaTeX 进一步处理但需要实际的“%”,则这将无济于事。