打开一个名称以点开头的文件和其他名称奇怪的文件?

打开一个名称以点开头的文件和其他名称奇怪的文件?

TeX 命令的语法\openout相当简单:

\openout=文件名

在哪里是一个四位数,但是什么文件名? 如何打开名称以点为星号的文件?更一般地说,如何处理作为参数传递的可能包含奇怪字符的文件名?


为了使我的困难具体化,下面是一系列命令:

  1. 将切换到临时目录
  2. 删除以前运行的所有剩余文件
  3. 创建一个名为的演示 tex 文件,joseph.tex该文件尝试写入名为 wright 的文件,然后写入名为 .joseph 的文件。
  4. 通过以下方式检查结果ls
  5. 尝试打印出结果文件

pushd /tmp; rm -f joseph* .joseph* wright*;cat<<EOF >joseph.tex
\newwrite\mywrite
\immediate\openout\mywrite=wright
\immediate\write\mywrite{Hello, World!}
\immediate\openout\mywrite=.joseph.tex
\immediate\write\mywrite{Hello, World!}
\bye
EOF
echo q | tex joseph.tex
ls -ls joseph* .joseph* wright*; cat wright.tex; popd

(将以上内容复制/粘贴到您最喜欢的命令 shell 中)我的输出是:

    This is TeX, Version 3.1415926 (TeX Live 2010)
    (./joseph.tex
    tex: Not writing to .joseph.tex (openout_any = p).

    ! I can't write on file `.joseph.tex'.
    l.4 \immediate\openout\mywrite=.joseph.tex

    (Press Enter to retry, or Control-D to exit; default file extension is `.tex')
    Please type another output file name:  )
    No pages of output.
    Transcript written on joseph.log.
    0 /tmp 12:12:05 $ ls -ls joseph* .joseph* wright*; cat wright.tex; popd
    /bin/ls: cannot access .joseph*: No such file or directory
    4 -rw-r--r-- 1 yogi yogi 449 2011-03-12 12:12 joseph.log
    4 -rw-r--r-- 1 yogi yogi 176 2011-03-12 12:12 joseph.tex
    4 -rw-r--r-- 1 yogi yogi  14 2011-03-12 12:12 wright.tex
    Hello, World!
    /tmp

我将其解释为无法创建名为 的文件.joseph,但成功创建了名为 的文件wright。我尝试创建名为 的文件./joseph ,但这似乎不起作用。当我尝试在目录中创建文件时,我担心最坏的情况,例如,.joseph/wright.thanks

答案1

这是 TeX Live 中默认启用的安全限制。

引用默认值texmf.cnf

% Allow TeX \openin, \openout, or \input on filenames starting with `.'
% (e.g., .rhosts) or outside the current tree (e.g., /etc/passwd)?
% a (any)        : any file can be opened.
% r (restricted) : disallow opening "dotfiles".
% p (paranoid)   : as `r' and disallow going to parent directories, and
%                  restrict absolute paths to be under $TEXMFOUTPUT.
openout_any = p
openin_any = a

因此,您需要设置openout_anya才能使示例正常运行。请注意,您应避免在系统范围内更改此功能,而应使用openout_any环境变量:

> openout_any=a tex myfile.tex

答案2

对我来说,一个简单的测试文件

\newwrite\mywrite
\openout\mywrite=.test
\immediate\write\mywrite{Hello world}
\bye

完全按预期工作。除了 UTF-8 字符可能无法按预期与 pdfTeX 配合使用这一限制外,我认为 TeX 并不太担心文件名。当然,空格是另一回事!

相关内容