summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-filename.html
blob: d62c51c24515394b1392ea6c19d2ea8776ac3ef0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<head>
<title>UK TeX FAQ -- question label filename</title>
</head><body>
<h3>What&#8217;s the name of this file</h3>
<p/>One might want this so as to automatically generate a page header or
footer recording what file is being processed.  It&#8217;s not easy&#8230;
<p/>TeX retains what it considers the name of the <em>job</em>, only, in
the primitive <code>\</code><code>jobname</code>; this is the name of the file first
handed to TeX, stripped of its directory name and of any extension
(such as <code>.tex</code>).  If no file was passed (i.e., you&#8217;re using
TeX interactively), <code>\</code><code>jobname</code> has the value <code>texput</code>
(the name that&#8217;s given to <code>.log</code> files in this case).
<p/>This is fine, for the case of a small document, held in a single file;
most significant documents will be held in a bunch of files, and
TeX makes no attempt to keep track of files input to the
<em>job</em>.  So the user has to keep track, himself &#8212; the only way
is to patch the input commands and cause them to retain details of the
file name.  This is particularly difficult in the case of Plain TeX,
since the syntax of the <code>\</code><code>input</code> command is so peculiar.
<p/>In the case of LaTeX, the input commands have pretty regular
syntax, and the simplest <a href="FAQ-patch.html">patching techniques</a> can be
used on them.
<p/>If you&#8217;re not inputting things from a file that&#8217;s already been input,
the job is almost trivial:
<blockquote>
<pre>
\def\ThisFile{\jobname}
\let\OldInput\input
\renewcommand{\input}[1]{%
  \renewcommand{\ThisFile}{#1}%
  \OldInput{#1}%
}
</pre>
</blockquote><p>
With that, the macro <code>\</code><code>ThisFile</code> always contains the last thing
input: it starts pointing at the base file of your document
(<code>\</code><code>jobname</code>), and thereafter changes every time you use
<code>\</code><code>input{</code><em>file</em><code>}</code>.
<p/>Most ordinary users will quickly become irritated with the simplicity
of of the <code>\</code><code>ThisFile</code> mechanism above.  The following code is more
cunning: it maintains details of the files you&#8217;ve &#8216;come through&#8217; to
get to where you are, and it restores <code>\</code><code>ThisFile</code> to what the
previous file was before returning.
<blockquote>
<pre>
\def\ThisFile{\jobname}
\newcounter{FileStack}
\let\OrigInput\input
\renewcommand{\input}[1]{%
  \stackinput{#1}{\OrigInput}%
}
\newcommand{\stackinput}[2]{%
  \stepcounter{FileStack}%
  \expandafter\let
    \csname NameStack\theFileStack\endcsname
    \ThisFile
  \def\ThisFile{#1}%
  #2{#1}%
  \expandafter\let\expandafter
    \ThisFile
    \csname NameStack\theFileStack\endcsname
  \addtocounter{FileStack}{-1}%
}
</pre>
</blockquote><p>
To do the same for <code>\</code><code>include</code>, we need the simple addition:
<blockquote>
<pre>
\let\OrigInclude\include
\renewcommand{\include}[1]{%
  \stackinput{#1}{\OrigInclude}%
}
</pre>
</blockquote><p>
Both examples of patching <code>\</code><code>input</code> assume you always use
LaTeX syntax, i.e., always use braces around the argument.
<p/>The <i>FiNK</i> (&#8220;File Name Keeper&#8221;) package provides a
regular means of keeping track of the current file name (with its
extension), in a macro <code>\</code><code>finkfile</code>.  If you need the unadorned file
name (without its &#8216;<code>.tex</code>&#8217;), use the commands:
<blockquote>
<pre>
\def\striptexext#1.tex{#1}
...
\edef\ThisFile{\expandafter\stripext\finkfile}
</pre>
</blockquote><p>
The <i>FiNK</i> bundle includes a <i>fink.el</i> that provides
support under <i>emacs</i> with AUC-TeX.
<dl>
<dt><tt><i>fink.sty</i></tt><dd><a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/fink.zip">macros/latex/contrib/fink</a> (or <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/fink/">browse the directory</a>)
</dl>
<p/><p>This question on the Web: <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=filename">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=filename</a>
</body>