我如何将 % 写入文件?

我如何将 % 写入文件?

我怎样才能写入%辅助文件?%不起作用,因为 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 进一步处理但需要实际的“%”,则这将无济于事。

相关内容