Packaging of LyX on Windows (will need tweaking for 1.4.x).

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10003 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2005-06-06 13:00:52 +00:00
parent a85913d21a
commit c48efc7922
37 changed files with 12944 additions and 0 deletions

View File

@ -0,0 +1,116 @@
Packaging LyX 1.3.6 for Windows
===============================
Preparing the way
=================
The very first thing to do on the way to creating a LyX/Win package is
to build the sources and install them somewhere accessible. (I've been
using PREFIX='/J/Programs/LyX'.)
Thereafter, the contents of this tree must be manipulated a
little. I've written a little script, package_lyxwin.sh, to automate
the process:
* Copy the DLLs qt-mt3.dll, libiconv-2.dll, mingwm10.dll to the
$PREFIX/bin/ directory. These are needed by the LyX executable.
* Strip the binaries in $PREFIX/bin/ of all debugging info.
* Copy dt2dv.exe and dv2dt.exe to $PREFIX/bin/ and clean_dvi.py to
$PREFIX/Resources/lyx/scripts/ These are needed to enable dvips, yap
et al. to cope with "file names with spaces".
* Add formats and converters to the $PREFIX/Resources/lyx/configure
script so that users can use the clean_dvi script transparently.
* Remove all stuff generated by running configure. It makes sense on
your machine only, not for whoever is installing LyX. Specifically
xfonts/fonts.dir, xfonts/fonts.scale, doc/LaTeXConfig.lyx,
lyxrc.defaults, packages.lst and textclass.lst
should all be removed.
Creating the LyX icons
======================
All icons are to be found in sub-directory icons/.
The LyX icons, lyx_32x32.ico and lyx_doc_32x32.ico, are based on .svg
files written and realease into the public domain by Andy Fitzsimon:
http://openclipart.org/clipart/computer/icons/etiquette-theme/aps/LyX.svg
http://openclipart.org/clipart/computer/icons/etiquette-theme/mimetype.svg
lyx.svg is Andy's original.
lyx_doc.svg is a merger of LyX.svg with mimetype.svg
Working on a linux box, I used sodipodi (http://www.sodipodi.com/) to
create the .svg file and to export these vector graphics images to
32x32 pixel bitmaps (.png format). Thereafter I used gimp
(http://www.gimp.org/) to generate reduced color depth versions (16,
256 colors).
Finally, on a WindowsXP machine, I used IconXP
(http://www.aha-soft.com/iconxp/) to build the .ico files from these
.png files at differing resolutions.
Adding the LyX icons to lyx.exe
===============================
********************************************************************
NOTE: Run 'strip' on lyx.exe before adding any images to it. 'strip'
will not work after images have been added.
$ strip lyx.exe
j:\mingw\bin\strip.exe: lyx.exe: File in wrong format
********************************************************************
Windows executables can store various "resources", including images. I
used ResourceHacker (http://rpi.net.au/~ajohnson/resourcehacker) to
add the LyX icons to the .exe file.
Fire up ResHacker.exe and load lyx.exe
File>Open... lyx.exe
Action>Add a new Resource...
Open file with resource ... lyx_32x32.ico
Resource Type will be set to "ICONGROUP"
Set Resource Name to "1". (No inverted commas.)
Add Resource
The icon will be shown in the main Resource Hacker window under
Icon Group>1>0 and as Icon>5[0-3].
Repeat for lyx_doc_32x32.ico, setting the Resource Name to "2".
Save the modified lyx.exe. Resource Hacker will copy the original to
lyx_original.exe. Remove it.
Building the LyX installer
==========================
At this point my J:\Programs\LyX tree now contains everything that is
to be released as a LyX/Win package. All that remains to do is to
generate a Windows installer for it. I've written a script for NSIS
(http://nsis.sourceforge.net/) to compile into an installer.
You'll need to compile and install lyx_path_prefix.dll. From the
comments in lyx_path_prefix.C:
/* Compile the code with
*
* g++ -I/c/Program\ Files/NSIS/Contrib -Wall -shared \
* lyx_path_prefix.c -o lyx_path_prefix.dll
*
* Move resulting .dll to /c/Program\ Files/NSIS/Plugins
*/
Thereafter, you'll be able to build the installer itself:
$ <PATH to>/makensis lyx_installer.nsi
creating lyx_setup_136.exe ready to ship.
END README

View File

@ -0,0 +1,100 @@
#! /usr/bin/env python
'''
file clean_dvi.py
This file is part of LyX, the document processor.
Licence details can be found in the file COPYING
or at http://www.lyx.org/about/licence.php3
author Angus Leeming
Full author contact details are available in the file CREDITS
or at http://www.lyx.org/about/credits.php
Usage:
python clean_dvi.py infile.dvi outfile.dvi
clean_dvi modifies the input .dvi file so that
dvips and yap (a dvi viewer on Windows) can find
any embedded PostScript files whose names are protected
with "-quotes.
It works by:
1 translating the machine readable .dvi file to human
readable .dtl form,
2 manipulating any references to external files
3 translating the .dtl file back to .dvi format.
It requires dv2dt and dt2dv from the DTL dviware package
http://www.ctan.org/tex-archive/dviware/dtl/
'''
import os, re, sys
def usage(prog_name):
return 'Usage: %s in.dvi out.dvi\n' \
% os.path.basename(prog_name)
def warning(message):
sys.stderr.write(message + '\n')
def error(message):
sys.stderr.write(message + '\n')
sys.exit(1)
def manipulated_dtl(data):
psfile_re = re.compile(r'(.*PSfile=")(.*)(" llx=.*)')
lines = data.split('\n')
for i in range(len(lines)):
line = lines[i]
match = psfile_re.search(line)
if match != None:
file = match.group(2).replace('"', '')
lines[i] = '%s%s%s' \
% ( match.group(1), file, match.group(3) )
return '\n'.join(lines)
def main(argv):
# First establish that the expected information has
# been input on the command line and whether the
# required executables exist.
if len(argv) != 3:
error(usage(argv[0]))
infile = argv[1]
outfile = argv[2]
if not os.path.exists(infile):
error('Unable to read "%s"\n' % infile)
# Convert the input .dvi file to .dtl format.
dv2dt_call = 'dv2dt "%s"' % infile
dv2dt_stdin, dv2dt_stdout, dv2dt_stderr = \
os.popen3(dv2dt_call, 't')
dv2dt_stdin.close()
dv2dt_data = dv2dt_stdout.read()
dv2dt_status = dv2dt_stdout.close()
if dv2dt_status != None or len(dv2dt_data) == 0:
dv2dt_err = dv2dt_stderr.read()
error("Failed: %s\n%s\n" % ( dv2dt_call, dv2dt_err) )
# Manipulate the .dtl file.
dtl_data = manipulated_dtl(dv2dt_data)
if dtl_data == None:
error("Failed to manipulate the dtl file")
# Convert this .dtl file back to .dvi format.
dt2dv_call = 'dt2dv -si "%s"' % outfile
dt2dv_stdin = os.popen(dt2dv_call, 'w')
dt2dv_stdin.write(dtl_data)
if __name__ == "__main__":
main(sys.argv)

View File

@ -0,0 +1,151 @@
# Makefile for dv2dt, dt2dv
# Version 0.6.1
# Thu 9 March 1995
# Geoffrey Tobin
# Nelson H. F. Beebe
#=======================================================================
BINDIR = /usr/local/bin
CATDIR = $(MANDIR)/../cat$(MANEXT)
CC = gcc
CFLAGS = -O2 -Wall
# Some compilers don't optimise correctly; for those, don't use `-O2' :
# CFLAGS = -Wall
CHMOD = /bin/chmod
COL = col -b
CP = /bin/cp
DITROFF = ditroff
DITROFF = groff
DT2DV = dt2dv.exe
DV2DT = dv2dt.exe
EXES = $(DT2DV) $(DV2DT)
LDFLAGS = -s
LDFLAGS =
MAN2PS = sh ./man2ps
MANDIR = /usr/local/man/man$(MANEXT)
MANEXT = 1
OBJS = dt2dv.o dv2dt.o
RM = /bin/rm -f
SHELL = /bin/sh
DOCS = README dtl.doc dvi.doc dt2dv.man dv2dt.man
SRC = Makefile dtl.h dt2dv.c dv2dt.c man2ps
TESTS = hello.tex example.tex tripvdu.tex edited.txt
DTL_DBN = $(DOCS) $(SRC) $(TESTS)
#=======================================================================
.SUFFIXES: .hlp .ps .man
.man.hlp:
$(DITROFF) -man -Tascii $< | $(COL) >$@
.man.ps:
$(MAN2PS) < $< > $@
#=======================================================================
#all: dtl check doc
all: dtl check
doc: dt2dv.hlp dv2dt.hlp dt2dv.ps dv2dt.ps
dtl: $(EXES)
check tests: hello example tripvdu edited
$(DV2DT): dv2dt.o dtl.h
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ dv2dt.o
$(DT2DV): dt2dv.o dtl.h
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ dt2dv.o
hello: hello.dtl $(EXES)
./dt2dv hello.dtl hello2.dvi
./dv2dt hello2.dvi hello2.dtl
-@diff hello.dtl hello2.dtl > hello.dif
@if [ -s hello.dif ] ; \
then echo ERROR: differences in hello.dif ; \
else $(RM) hello.dif ; \
fi
hello.dtl: hello.tex
tex hello
./dv2dt hello.dvi hello.dtl
example: example.dtl $(EXES)
./dt2dv example.dtl example2.dvi
./dv2dt example2.dvi example2.dtl
-@diff example.dtl example2.dtl > example.dif
@if [ -s example.dif ] ; \
then echo ERROR: differences in example.dif ; \
else $(RM) example.dif ; \
fi
example.dtl: example.tex
tex example
./dv2dt example.dvi example.dtl
tripvdu: tripvdu.dtl $(EXES)
./dt2dv tripvdu.dtl tripvdu2.dvi
./dv2dt tripvdu2.dvi tripvdu2.dtl
-@diff tripvdu.dtl tripvdu2.dtl > tripvdu.dif
@if [ -s tripvdu.dif ] ; \
then echo ERROR: differences in tripvdu.dif ; \
else $(RM) tripvdu.dif ; \
fi
tripvdu.dtl: tripvdu.tex
tex tripvdu
./dv2dt tripvdu.dvi tripvdu.dtl
# edited.txt is already a dtl file.
edited: edited.txt $(EXES)
./dt2dv edited.txt edited.dvi
./dv2dt edited.dvi edited2.dtl
./dt2dv edited2.dtl edited2.dvi
./dv2dt edited2.dvi edited3.dtl
@if [ -s edited.dif ] ; \
then echo ERROR : differences in edited.dif ; \
else $(RM) edited.dif ; \
fi
clean mostlyclean:
-$(RM) $(OBJS)
clobber: clean
-$(RM) $(EXES) *~ core *.log *.dvi *.dtl *.dif
distclean realclean: clobber
-$(RM) dt2dv.hlp dv2dt.hlp dt2dv.ps dv2dt.ps
install: dtl
-$(MAKE) uninstall
$(CP) dt2dv $(BINDIR)/dt2dv
$(CHMOD) 775 $(BINDIR)/dt2dv
$(CP) dv2dt $(BINDIR)/dv2dt
$(CHMOD) 775 $(BINDIR)/dv2dt
$(CP) dt2dv.man $(MANDIR)/dt2dv.$(MANEXT)
$(CHMOD) 664 $(MANDIR)/dt2dv.$(MANEXT)
$(CP) dv2dt.man $(MANDIR)/dv2dt.$(MANEXT)
$(CHMOD) 664 $(MANDIR)/dv2dt.$(MANEXT)
uninstall:
-$(RM) $(BINDIR)/dt2dv
-$(RM) $(BINDIR)/dv2dt
-$(RM) $(CATDIR)/dt2dv.$(MANEXT)
-$(RM) $(CATDIR)/dv2dt.$(MANEXT)
dist: dtl.tar.gz
dtl.tar.gz: $(DTL_DBN)
tar -czf dtl.tar.gz $(DTL_DBN)
zip: dtl.zip
dtl.zip: $(DTL_DBN)
zip dtl.zip $(DTL_DBN)
# EOF Makefile

View File

@ -0,0 +1,143 @@
README for DTL package - Thu 9 March 1995
-----------------------------------------
Author: Geoffrey Tobin <G.Tobin@ee.latrobe.edu.au>
Version: 0.6.1
CTAN Archive-path: dviware/dtl
Brief Description:
DTL (DVI Text Language) files are equivalent to TeX's DVI files,
but are humanly readable, instead of binary. Two programs are
provided to translate between DVI and DTL: dv2dt, dt2dv.
dt2dv warns if byte addresses or string lengths recorded in a DTL
file are incorrect, then overrides them. This makes DTL files
editable. It also allows quoted apostrophes (\') and quoted quotes
(\\) in strings. The current DTL variety, sequences-6, separates
font paths into directory and font, which makes them freely editable.
In this release, DTL line numbers are correctly calculated, and three
memory leaks have been fixed.
Keywords: dvi, TeX
Includes:
Makefile README dt2dv.c dtl.h dv2dt.c
man2ps dtl.doc dvi.doc dt2dv.man dv2dt.man
hello.tex example.tex tripvdu.tex edited.txt
Motivation:
When TeX has typeset a document, it writes its handiwork to a DVI
file, for DVI processing software (such as viewers, printer drivers,
dvidvi, and dvicopy) to read.
The file dvi.doc lists the DVI file commands, with their opcodes
(byte values), nominal command names, arguments, and meanings. For a
detailed description of DVI file structure, see one of these:
1. Donald E. Knuth's book _TeX: The Program_;
2. The file tex.web, which contains source and documentation for TeX:
CTAN: systems/knuth/tex/tex.web
3. The source for Knuth's dvitype program:
CTAN: systems/knuth/texware/dvitype.web
4. Joachim Schrod's DVI drivers standard document, the relevant part
of which is at
CTAN: dviware/driv-standard/level-0
Sometimes human beings are interested to see exactly what TeX has
produced, for example when viewing or printing of the DVI file gives
unexpected results. However, a DVI file is a compact binary
representation, so we need software to display its contents.
Binary file editors, when available, can show the DVI bytes, but not
their meanings, except for the portions that represent embedded text.
In particular, the command names are not shown, and the command
boundaries are not respected.
By contrast, Knuth's dvitype program is designed as an example of a
DVI driver. However, dvitype is inconvenient for studying the DVI
file alone, for the following reasons:
1. Being a DVI driver, dvitype endeavors to read the TFM font metric
files referenced in the DVI file. If a TFM file is absent, dvitype
quits with an error message.
2. When it starts, it prompts the user interactively for each of a
series of options.
3. Even the least verbose option gives masses of information that is
not contained in the DVI file, coming instead from a combination of
the data in the DVI file and TFM files.
4. It does NOT show the DVI information in a way that accurately
reflects the structure of the DVI file.
5. Its output, if redirected to a file, produces a very large file.
6. There is no automated procedure for converting the output of
dvitype back to a DVI file, and doing it by hand is totally
unreasonable.
The first disadvantage is a killer if a TFM file is absent.
Disadvantages two to four make dvitype very inconvenient for studying
a DVI file. The fifth problem makes dvitype's output tedious,
disk-hungry (so one deletes it almost immediately), and unsuitable for
file transfer.
The sixth disadvantage of dvitype is important to those people who are
interested in editing DVI files. Since the DVI files refer explicitly
to their own internal byte addresses, it's very easy to mess up a DVI
file if one were to try to edit it directly, even apart from the problem
of how to recognise a command.
So an exact, concise, textual representation of a DVI file is needed,
but dvitype does not produce one.
Resolution:
Therefore, working from Joachim Schrod's description, I designed DTL
and its conversion programs dv2dt (DVI -> DTL) and dt2dv (DTL -> DVI),
which are provided as C sources:
dtl.h
dv2dt.c
dt2dv.c
Although I was motivated by the TFM <-> PL conversion provided by
Knuth's tftopl and pltotf programs, I deliberately designed DTL to be
a much more concise and literal translation than the `property list'
structure exemplified by PL. The result is that a DTL file is
typically three times the size of its equivalent DVI file. The
document dtl.doc lists the correspondence between the DTL command
names and the (nominal) DVI command names.
A clear advantage of an exact two-way conversion is that we can check
(and prove) whether the converters worked truly on a given DVI file.
The provided plain TeX files:
example.tex
tripvdu.tex
can be used to test whether the compiled programs are behaving
sensibly. Whereas example.tex is a simple document that uses a
variety of plain TeX commands, tripvdu.tex provides a kind of
`trip test' for DVI processor programs. Both documents are taken,
with permission, from Andrew K. Trevorrow's dvitovdu (alias dvi2vdu)
distribution (and are also part of the dvgt viewer distribution).
The Makefile might have to be edited for your site, as it assumes
gcc for your C compiler. Makefile compiles dv2dt and dt2dv, then
runs tex on example.tex and tripvdu.tex, and also converts the
resulting DVI files to DTL files, back to DVI files (with a change
of name), then back again to DTL files, so that the results can be
compared using a textual differencing program. (Many computer systems
have such a program; on unix, as assumed by Makefile, this is named
`diff'; ms-dos has one named `comp'.) This should produce a
zero-length .dif file for each document, proving that the two DTL
files are identical.
A keen tester might also use a binary difference program on the DVI
files, to check that they are identical, as they need to be. (On unix
systems, the `diff' program suffices for that purpose.)
Note:
In representing numeric quantities, I have mainly opted to use
decimal notation, as this is how most of us are trained to think.
However, for the checksums in the `fd' (font definition) commands, I
chose octal notation, as this is used for checksums in Knuth's PL
files, against which DVI files must be compared when a DVI driver
loads a font.
Caveat:
The length of DTL commands is limited by the size of the line buffer
in dt2dv.c.
End of README

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,156 @@
.\" ====================================================================
.\" @Troff-man-file{
.\" author = "Nelson H. F. Beebe and Geoffrey R. D. Tobin",
.\" version = "0.6.0",
.\" date = "08 March 1995",
.\" time = "19:57:00 GMT +11",
.\" filename = "dt2dv.man",
.\" address = "Center for Scientific Computing
.\" Department of Mathematics
.\" University of Utah
.\" Salt Lake City, UT 84112
.\" USA",
.\" telephone = "+1 801 581 5254",
.\" FAX = "+1 801 581 4148",
.\" checksum = "03708 156 634 4989",
.\" email = "beebe@math.utah.edu (Internet)",
.\" codetable = "ISO/ASCII",
.\" keywords = "DVI, TeX",
.\" supported = "no",
.\" docstring = "This file contains the UNIX manual pages
.\" for the dt2dv utility, a program for
.\" converting a DTL text representation of a TeX
.\" DVI file, usually produced by the companion
.\" dv2dt utility, back to a binary DVI file.
.\"
.\" The checksum field above contains a CRC-16
.\" checksum as the first value, followed by the
.\" equivalent of the standard UNIX wc (word
.\" count) utility output of lines, words, and
.\" characters. This is produced by Robert
.\" Solovay's checksum utility.",
.\" }
.\" ====================================================================
.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
.if n .ds Te TeX
.TH DT2DV 1 "08 March 1995" "Version 0.6.0"
.\"======================================================================
.SH NAME
dt2dv \- convert a DTL text representation of a TeX DVI file to a binary DVI file
.\"======================================================================
.SH SYNOPSIS
.B dt2dv
.RB [ \-debug ]
.RB [ \-group ]
.RB [ \-si ]
.RB [ \-so ]
.I [input-DTL-file]
.I [output-DVI-file]
.PP
In the absence of the
.B \-si
and
.B \-so
options,
both file arguments are
.IR required
in the order
.B input-DTL-file output-DVI-file .
But also see the OPTIONS section below.
No default file extensions are supplied.
.\"======================================================================
.SH DESCRIPTION
.B dt2dv
converts a text representation of a \*(Te\& DVI
file, usually produced by the companion
.BR dv2dt (1)
utility, back to a binary DVI file. DTL
.RI ( "DVI Text Language" )
files can be edited, with care, and then restored
to DVI form for processing by any \*(Te\& DVI
driver program. In DTL files, font directory names
and font names are preceded by a length field,
which must be updated if the names are modified.
.PP
.BR dvitype (1)
can also display a textual representation of DVI
files, but in some implementations at least, it
cannot be used in batch mode, and its output is
not well-suited for conversion back to a DVI file.
.PP
The format of \*(Te\& DVI files is fully described
in
Donald E. Knuth,
.IR "\*(Te\&: The Program" ,
Addison-Wesley (1986), ISBN 0-201-13437-3, as well
as in the
.BR dvitype (1)
literate program source code. Brief descriptions
of the DTL and DVI formats are given in
.BR dv2dt (1).
.\"======================================================================
.SH OPTIONS
.\"-----------------------------------------------
.TP \w'\-debug'u+3n
.B \-debug
Turn on detailed debugging output.
.\"-----------------------------------------------
.TP
.B \-group
Expect each DTL command to be in parentheses.
.\"-----------------------------------------------
.TP
.B \-si
Read all DTL commands from standard input.
.\"-----------------------------------------------
.TP
.B \-so
Write all DVI commands to standard output.
.\"======================================================================
.SH "SEE ALSO"
.BR dv2dt (1),
.BR dvitype (1),
.BR tex (1).
.\"======================================================================
.SH FILES
.TP \w'\fI*.dvi\fP'u+3n
.I *.dvi
binary \*(Te\& DVI file.
.TP
.I *.dtl
text representation of a \*(Te\& DVI file in
.I "DVI Text Language"
format.
.\"======================================================================
.SH AUTHOR
.B dt2dv
and
.BR dv2dt (1)
were written by
.RS
.nf
Geoffrey Tobin
Department of Electronic Engineering
La Trobe University
Bundoora, Victoria 3083
Australia
Tel: +61 3 479 3736
FAX: +61 3 479 3025
Email: <G.Tobin@ee.latrobe.edu.au>
.fi
.RE
.PP
These manual pages were written primarily by
.RS
.nf
Nelson H. F. Beebe, Ph.D.
Center for Scientific Computing
Department of Mathematics
University of Utah
Salt Lake City, UT 84112
Tel: +1 801 581 5254
FAX: +1 801 581 4148
Email: <beebe@math.utah.edu>
.fi
.RE
.\"==============================[The End]==============================

View File

@ -0,0 +1,77 @@
``dtl.doc''
Wed 8 March 1995
Geoffrey Tobin
Correspondence between DTL and DVI files.
-----------------------------------------
DTL variety sequences-6, version 0.6.0
--------------------------------------
Note: `DTL' stands for `Device-Independent Text Language', and is an
ASCII text representation of a DVI file.
References for DVI file structure:
----------------------------------
In this distribution:
dvi.doc
In the TeX archives:
CTAN: dviware/driv-standard/level-0/dvistd0.tex
"The DVI Driver Standard, Level 0",
by The TUG DVI Driver Standards Committee (now defunct)
chaired by Joachim Schrod.
Appendix A, "Device-Independent File Format",
section A.2, "Summary of DVI commands".
DTL Commands
------------
variety <variety-name> Specifies name of DTL file type.
Naturally, `variety' has no DVI equivalent.
The other DTL commands correspond one-to-one with DVI commands, but I
have used briefer names (except for `special') than those used in the
DVI standards document.
DTL : DVI
(text) : series of set_char commands, for printable ASCII text
\( : literal ASCII left parenthesis in (text)
\) : literal ASCII right parenthesis in (text)
\\ : literal ASCII backslash in (text)
\" : literal ASCII double quote in (text)
\XY : set_char for character with hexadecimal code XY,
not in parentheses, but by itself for readability
s1, s2, s2, s3 : set, with (1,2,3,4)-byte charcodes
sr : set_rule
p1, p2, p2, p3 : put, with (1,2,3,4)-byte charcodes
pr : put_rule
nop : nop (do nothing)
bop : bop (beginning of page)
eop : eop (end of page)
[ : push
] : pop
r1, r2, r3, r4 : right, with (1,2,3,4)-byte argument
w0, w1, w2, w3, w4 : as in DVI
x0, x1, x2, x3, x4 : as in DVI
d1, d2, d3, d4 : down, with (1,2,3,4)-byte argument
y0, y1, y2, y3, y4 : as in DVI
z0, z1, z2, z3, z4 : as in DVI
fn : fnt_num (set current font to font number in 0 to 63)
f1, f2, f3, f4 : fnt (set current font to (1,2,3,4)-byte font number)
special : xxx (special commands with (1,2,3,4)-byte string length)
fd : fnt_def (assign a number to a named font)
pre : preamble
post : post (begin postamble)
post_post : post_post (end postamble)
opcode : undefined DVI command (250 to 255)
---------------
EOF ``dtl.doc''
---------------

View File

@ -0,0 +1,174 @@
/* dtl.h
- header for dv2dt.c and dt2dv.c, conversion programs
for human-readable "DTL" <-> DVI.
- (ANSI C) version 0.6.0 - 18:31 GMT +11 Wed 8 March 1995
- author: Geoffrey Tobin G.Tobin@ee.latrobe.edu.au
- patch: Michal Tomczak-Jaegermann ntomczak@vm.ucs.ualberta.ca
- Reference: "The DVI Driver Standard, Level 0",
by The TUG DVI Driver Standards Committee.
Appendix A, "Device-Independent File Format".
*/
/* variety of DTL produced */
#define VARIETY "sequences-6"
/* version of DTL programs */
#define VERSION "0.6.0"
/* Test for ANSI/ISO Standard C */
#if (defined(__cplusplus) || defined(__STDC__) || defined(c_plusplus))
#define STDC 1
#else
#define STDC 0
#endif
/* Version (Traditional or ANSI) of C affects prototype and type definitions */
#if STDC
#define ARGS(parenthesized_list) parenthesized_list
#else /* NOT STDC */
#define ARGS(parenthesized_list) ()
#endif /* NOT STDC */
#if STDC
#define Void void
#define VOID void
#define FILE_BEGIN SEEK_SET
#else /* NOT STDC */
#define Void int
#define VOID
#define FILE_BEGIN 0
#endif /* NOT STDC */
/* types to store 4 byte signed and unsigned integers */
typedef long S4;
typedef unsigned long U4;
/* scanf and printf formats to read or write those */
#define SF4 "%ld"
#define UF4 "%lu"
/* 4 byte hexadecimal */
/* #define XF4 "%04lx" */
#define XF4 "%lx"
/* 4 byte octal */
#define OF4 "%lo"
/* type for byte count for DVI file */
/* COUNT must be large enough to hold a U4 (unsigned 4 byte) value */
typedef U4 COUNT;
/* size of a TeX and DVI word is 32 bits; in some systems a `long int' is needed */
typedef long int word_t;
/* format for a DVI word */
#define WF "%ld"
/* string of 8-bit characters for machine: keyboard, screen, memory */
#define MAXSTRLEN 256
typedef char String[MAXSTRLEN+1];
/* string s of length l and maximum length m */
typedef struct {int l; int m; char * s;} Lstring;
int debug = 0; /* normally, debugging is off */
/* Is each DTL command parenthesised by a BCOM and an ECOM? */
int group = 0; /* by default, no grouping */
/* signals of beginning and end of a command and its arguments */
/* these apply only if group is nonzero */
# define BCOM "{"
# define ECOM "}"
# define BCOM_CHAR '{'
# define ECOM_CHAR '}'
/* beginning and end of a message string */
#define BMES "'"
#define EMES BMES
#define BMES_CHAR '\''
#define EMES_CHAR BMES_CHAR
/* beginning and end of sequence of font characters */
#define BSEQ "("
#define ESEQ ")"
#define BSEQ_CHAR '('
#define ESEQ_CHAR ')'
/* escape and quote characters */
#define ESC_CHAR '\\'
#define QUOTE_CHAR '\"'
/* command names in DTL */
#define SETCHAR "\\"
#define SET "s"
#define SET1 "s1"
#define SET2 "s2"
#define SET3 "s3"
#define SET4 "s4"
#define SETRULE "sr"
#define PUT "p"
#define PUT1 "p1"
#define PUT2 "p2"
#define PUT3 "p3"
#define PUT4 "p4"
#define PUTRULE "pr"
#define NOP "nop"
#define BOP "bop"
#define EOP "eop"
#define PUSH "["
#define POP "]"
#define RIGHT "r"
#define RIGHT1 "r1"
#define RIGHT2 "r2"
#define RIGHT3 "r3"
#define RIGHT4 "r4"
#define W "w"
#define W0 "w0"
#define W1 "w1"
#define W2 "w2"
#define W3 "w3"
#define W4 "w4"
#define X "x"
#define X0 "x0"
#define X1 "x1"
#define X2 "x2"
#define X3 "x3"
#define X4 "x4"
#define DOWN "d"
#define DOWN1 "d1"
#define DOWN2 "d2"
#define DOWN3 "d3"
#define DOWN4 "d4"
#define Y "y"
#define Y0 "y0"
#define Y1 "y1"
#define Y2 "y2"
#define Y3 "y3"
#define Y4 "y4"
#define Z "z"
#define Z0 "z0"
#define Z1 "z1"
#define Z2 "z2"
#define Z3 "z3"
#define Z4 "z4"
#define FONT "f"
#define FONT1 "f1"
#define FONT2 "f2"
#define FONT3 "f3"
#define FONT4 "f4"
#define FONTDEF "fd"
#define FONTNUM "fn"
#define SPECIAL "special"
#define PRE "pre"
#define POST "post"
#define POSTPOST "post_post"
#define OPCODE "opcode"
/* end dtl.h */

View File

@ -0,0 +1,919 @@
/* dv2dt - convert DVI file to human-readable "DTL" format.
- (ANSI C) version 0.6.0 - 17:54 GMT +11 Wed 8 March 1995
- author: Geoffrey Tobin ecsgrt@luxor.latrobe.edu.au
- patch: Michal Tomczak-Jaegermann ntomczak@vm.ucs.ualberta.ca
- Reference: "The DVI Driver Standard, Level 0",
by The TUG DVI Driver Standards Committee.
Appendix A, "Device-Independent File Format".
*/
/* unix version; read from stdin, write to stdout, by default. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "dtl.h"
#define PRINT_BCOM if (group) fprintf (dtl, "%s", BCOM)
#define PRINT_ECOM if (group) fprintf (dtl, "%s", ECOM)
/*
operation's:
opcode,
name,
number of args,
string of arguments.
*/
struct op_info_st {int code; char * name; int nargs; char * args; };
typedef struct op_info_st op_info;
/*
table's:
name,
first opcode,
last opcode,
pointer to opcode info.
*/
struct op_table_st {char * name; int first; int last; op_info * list; };
typedef struct op_table_st op_table;
/* Table for opcodes 128 to 170 inclusive. */
op_info op_info_128_170 [] =
{
{128, "s1", 1, "1"},
{129, "s2", 1, "2"},
{130, "s3", 1, "3"},
{131, "s4", 1, "-4"},
{132, "sr", 2, "-4 -4"},
{133, "p1", 1, "1"},
{134, "p2", 1, "2"},
{135, "p3", 1, "3"},
{136, "p4", 1, "-4"},
{137, "pr", 2, "-4 -4"},
{138, "nop", 0, ""},
{139, "bop", 11, "-4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4"},
{140, "eop", 0, ""},
{141, "[", 0, ""},
{142, "]", 0, ""},
{143, "r1", 1, "-1"},
{144, "r2", 1, "-2"},
{145, "r3", 1, "-3"},
{146, "r4", 1, "-4"},
{147, "w0", 0, ""},
{148, "w1", 1, "-1"},
{149, "w2", 1, "-2"},
{150, "w3", 1, "-3"},
{151, "w4", 1, "-4"},
{152, "x0", 0, ""},
{153, "x1", 1, "-1"},
{154, "x2", 1, "-2"},
{155, "x3", 1, "-3"},
{156, "x4", 1, "-4"},
{157, "d1", 1, "-1"},
{158, "d2", 1, "-2"},
{159, "d3", 1, "-3"},
{160, "d4", 1, "-4"},
{161, "y0", 0, ""},
{162, "y1", 1, "-1"},
{163, "y2", 1, "-2"},
{164, "y3", 1, "-3"},
{165, "y4", 1, "-4"},
{166, "z0", 0, ""},
{167, "z1", 1, "-1"},
{168, "z2", 1, "-2"},
{169, "z3", 1, "-3"},
{170, "z4", 1, "-4"}
}; /* op_info op_info_128_170 [] */
op_table op_128_170 = {"op_128_170", 128, 170, op_info_128_170};
/* Table for font with 1 to 4 bytes (opcodes 235 to 238) inclusive. */
op_info fnt_n [] =
{
{235, "f1", 1, "1"},
{236, "f2", 1, "2"},
{237, "f3", 1, "3"},
{238, "f4", 1, "-4"}
}; /* op_info fnt_n [] */
op_table fnt = {"f", 235, 238, fnt_n};
/* function prototypes */
int open_dvi ARGS((char * dvi_file, FILE ** dvi));
int open_dtl ARGS((char * dtl_file, FILE ** dtl));
int dv2dt ARGS((FILE * dvi, FILE * dtl));
COUNT wunsigned ARGS((int n, FILE * dvi, FILE * dtl));
COUNT wsigned ARGS((int n, FILE * dvi, FILE * dtl));
S4 rsigned ARGS((int n, FILE * dvi));
U4 runsigned ARGS((int n, FILE * dvi));
COUNT wtable ARGS((op_table table, int opcode, FILE * dvi, FILE * dtl));
COUNT setseq ARGS((int opcode, FILE * dvi, FILE * dtl));
Void setpchar ARGS((int charcode, FILE * dtl));
Void xferstring ARGS((int k, FILE * dvi, FILE * dtl));
COUNT special ARGS((FILE * dvi, FILE * dtl, int n));
COUNT fontdef ARGS((FILE * dvi, FILE * dtl, int n));
COUNT preamble ARGS((FILE * dvi, FILE * dtl));
COUNT postamble ARGS((FILE * dvi, FILE * dtl));
COUNT postpost ARGS((FILE * dvi, FILE * dtl));
String program; /* name of dv2dt program */
int
main
#ifdef STDC
(int argc, char * argv[])
#else
(argc, argv)
int argc;
char * argv[];
#endif
{
FILE * dvi = stdin;
FILE * dtl = stdout;
/* Watch out: C's standard library's string functions are dicey */
strncpy (program, argv[0], MAXSTRLEN);
if (argc > 1)
open_dvi (argv[1], &dvi);
if (argc > 2)
open_dtl (argv[2], &dtl);
dv2dt (dvi, dtl);
return 0; /* OK */
}
/* end main */
int
open_dvi
#ifdef STDC
(char * dvi_file, FILE ** pdvi)
#else
(dvi_file, pdvi)
char * dvi_file;
FILE ** pdvi;
#endif
/* I: dvi_file; I: pdvi; O: *pdvi. */
{
if (pdvi == NULL)
{
fprintf (stderr, "%s: address of dvi variable is NULL.\n", program);
exit (1);
}
*pdvi = fopen (dvi_file, "rb");
if (*pdvi == NULL)
{
fprintf (stderr, "%s: Cannot open \"%s\" for binary reading.\n",
program, dvi_file);
exit (1);
}
return 1; /* OK */
}
/* open_dvi */
int
open_dtl
#ifdef STDC
(char * dtl_file, FILE ** pdtl)
#else
(dtl_file, pdtl)
char * dtl_file;
FILE ** pdtl;
#endif
/* I: dtl_file; I: pdtl; O: *pdtl. */
{
if (pdtl == NULL)
{
fprintf (stderr, "%s: address of dtl variable is NULL.\n", program);
exit (1);
}
*pdtl = fopen (dtl_file, "w");
if (*pdtl == NULL)
{
fprintf (stderr, "%s: Cannot open \"%s\" for text writing.\n",
program, dtl_file);
exit (1);
}
return 1; /* OK */
}
/* open_dtl */
int
dv2dt
#ifdef STDC
(FILE * dvi, FILE * dtl)
#else
(dvi, dtl)
FILE * dvi;
FILE * dtl;
#endif
{
int opcode;
COUNT count; /* intended to count bytes to DVI file; as yet unused. */
PRINT_BCOM;
fprintf (dtl, "variety ");
/* fprintf (dtl, BMES); */
fprintf (dtl, VARIETY);
/* fprintf (dtl, EMES); */
PRINT_ECOM;
fprintf (dtl, "\n");
/* start counting DVI bytes */
count = 0;
while ((opcode = fgetc (dvi)) != EOF)
{
PRINT_BCOM; /* start of command and parameters */
if (opcode < 0 || opcode > 255)
{
count += 1;
fprintf (stderr, "%s: Non-byte from \"fgetc()\"!\n", program);
exit (1);
}
else if (opcode <= 127)
{
/* setchar commands */
/* count += 1; */
/* fprintf (dtl, "%s%d", SETCHAR, opcode); */
count +=
setseq (opcode, dvi, dtl);
}
else if (opcode >= 128 && opcode <= 170)
{
count +=
wtable (op_128_170, opcode, dvi, dtl);
}
else if (opcode >= 171 && opcode <= 234)
{
count += 1;
fprintf (dtl, "%s%d", FONTNUM, opcode - 171);
}
else if (opcode >= 235 && opcode <= 238)
{
count +=
wtable (fnt, opcode, dvi, dtl);
}
else if (opcode >= 239 && opcode <= 242)
{
count +=
special (dvi, dtl, opcode - 238);
}
else if (opcode >= 243 && opcode <= 246)
{
count +=
fontdef (dvi, dtl, opcode - 242);
}
else if (opcode == 247)
{
count +=
preamble (dvi, dtl);
}
else if (opcode == 248)
{
count +=
postamble (dvi, dtl);
}
else if (opcode == 249)
{
count +=
postpost (dvi, dtl);
}
else if (opcode >= 250 && opcode <= 255)
{
count += 1;
fprintf (dtl, "opcode%d", opcode);
}
else
{
count += 1;
fprintf (stderr, "%s: unknown byte.\n", program);
exit (1);
}
PRINT_ECOM; /* end of command and parameters */
fprintf (dtl, "\n");
if (fflush (dtl) == EOF)
{
fprintf (stderr, "%s: fflush on dtl file gave write error!\n", program);
exit (1);
}
} /* end while */
return 1; /* OK */
}
/* dv2dt */
COUNT
wunsigned
#ifdef STDC
(int n, FILE * dvi, FILE * dtl)
#else
(n, dvi, dtl)
int n;
FILE * dvi;
FILE * dtl;
#endif
{
U4 unum;
fprintf (dtl, " ");
unum = runsigned (n, dvi);
fprintf (dtl, UF4, unum);
return n;
}
/* end wunsigned */
COUNT
wsigned
#ifdef STDC
(int n, FILE * dvi, FILE * dtl)
#else
(n, dvi, dtl)
int n;
FILE * dvi;
FILE * dtl;
#endif
{
S4 snum;
fprintf (dtl, " ");
snum = rsigned (n, dvi);
fprintf (dtl, SF4, snum);
return n;
}
/* end wsigned */
U4
runsigned
#ifdef STDC
(int n, FILE * dvi)
#else
(n, dvi)
int n;
FILE * dvi;
#endif
/* read 1 <= n <= 4 bytes for an unsigned integer from dvi file */
/* DVI format uses Big-endian storage of numbers. */
{
U4 integer;
int ibyte = 0;
int i;
if (n < 1 || n > 4)
{
fprintf (stderr,
"%s: runsigned() asked for %d bytes. Must be 1 to 4.\n", program, n);
exit (1);
}
/* Following calculation works iff storage is big-endian. */
integer = 0;
for (i = 0; i < n; i++)
{
integer *= 256;
ibyte = fgetc (dvi);
integer += ibyte;
}
return integer;
}
/* end runsigned */
S4
rsigned
#ifdef STDC
(int n, FILE * dvi)
#else
(n, dvi)
int n;
FILE * dvi;
#endif
/* read 1 <= n <= 4 bytes for a signed integer from dvi file */
/* DVI format uses Big-endian storage of numbers. */
{
S4 integer;
int ibyte = 0;
int i;
if (n < 1 || n > 4)
{
fprintf (stderr,
"%s: rsigned() asked for %d bytes. Must be 1 to 4.\n", program, n);
exit (1);
}
/* Following calculation works iff storage is big-endian. */
integer = 0;
for (i = 0; i < n; i++)
{
integer *= 256;
ibyte = fgetc (dvi);
/* Big-endian implies sign byte is first byte. */
if (i == 0 && ibyte >= 128)
{
ibyte -= 256;
}
integer += ibyte;
}
return integer;
}
/* end rsigned */
COUNT
wtable
#ifdef STDC
(op_table table, int opcode, FILE * dvi, FILE * dtl)
#else
(table, opcode, dvi, dtl)
op_table table;
int opcode;
FILE * dvi;
FILE * dtl;
#endif
/* write command with given opcode in given table */
/* return number of DVI bytes in this command */
{
op_info op; /* pointer into table of operations and arguments */
COUNT bcount = 0; /* number of bytes in arguments of this opcode */
String args; /* arguments string */
int i; /* count of arguments read from args */
int pos; /* position in args */
/* Defensive programming. */
if (opcode < table.first || opcode > table.last)
{
fprintf (stderr,
"%s: opcode %d is outside table %s [ %d to %d ] !\n",
program, opcode, table.name, table.first, table.last);
exit (1);
}
op = table.list [opcode - table.first];
/* Further defensive programming. */
if (op.code != opcode)
{
fprintf (stderr, "%s: internal table %s wrong!\n", program, table.name);
exit (1);
}
bcount = 1;
fprintf (dtl, "%s", op.name);
/* NB: sscanf does an ungetc, */
/* so args must be writable. */
strncpy (args, op.args, MAXSTRLEN);
pos = 0;
for (i = 0; i < op.nargs; i++)
{
int argtype; /* sign and number of bytes in current argument */
int nconv; /* number of successful conversions from args */
int nread; /* number of bytes read from args */
nconv = sscanf (args + pos, "%d%n", &argtype, &nread);
/* internal consistency checks */
if (nconv != 1 || nread <= 0)
{
fprintf (stderr,
"%s: internal read of table %s failed!\n", program, table.name);
exit (1);
}
pos += nread;
bcount += ( argtype < 0 ?
wsigned (-argtype, dvi, dtl) :
wunsigned (argtype, dvi, dtl) ) ;
} /* end for */
return bcount;
}
/* wtable */
COUNT
setseq
#ifdef STDC
(int opcode, FILE * dvi, FILE * dtl)
#else
(opcode, dvi, dtl)
int opcode;
FILE * dvi;
FILE * dtl;
#endif
/* write a sequence of setchar commands */
/* return count of DVI bytes interpreted into DTL */
{
int charcode = opcode; /* fortuitous */
int ccount = 0;
if (!isprint (charcode))
{
ccount = 1;
fprintf (dtl, "%s%02X", SETCHAR, opcode);
}
else
{
/* start of sequence of font characters */
fprintf (dtl, BSEQ);
/* first character */
ccount = 1;
setpchar (charcode, dtl);
/* subsequent characters */
while ((opcode = fgetc (dvi)) != EOF)
{
if (opcode < 0 || opcode > 127)
{
break; /* not a setchar command, so sequence has ended */
}
charcode = opcode; /* fortuitous */
if (!isprint (charcode)) /* not printable ascii */
{
break; /* end of font character sequence, as for other commands */
}
else /* printable ASCII */
{
ccount += 1;
setpchar (charcode, dtl);
}
} /* end for loop */
/* prepare to reread opcode of next DVI command */
if (ungetc (opcode, dvi) == EOF)
{
fprintf (stderr, "setseq: cannot push back a byte\n");
exit (1);
}
/* end of sequence of font characters */
fprintf (dtl, ESEQ);
}
return ccount;
}
/* setseq */
Void
setpchar
#ifdef STDC
(int charcode, FILE * dtl)
#else
(charcode, dtl)
int charcode;
FILE * dtl;
#endif
/* set printable character */
{
switch (charcode)
{
case ESC_CHAR:
fprintf (dtl, "%c", ESC_CHAR);
fprintf (dtl, "%c", ESC_CHAR);
break;
case QUOTE_CHAR:
fprintf (dtl, "%c", ESC_CHAR);
fprintf (dtl, "%c", QUOTE_CHAR);
break;
case BSEQ_CHAR:
fprintf (dtl, "%c", ESC_CHAR);
fprintf (dtl, "%c", BSEQ_CHAR);
break;
case ESEQ_CHAR:
fprintf (dtl, "%c", ESC_CHAR);
fprintf (dtl, "%c", ESEQ_CHAR);
break;
default:
fprintf (dtl, "%c", charcode);
break;
}
}
/* setpchar */
Void
xferstring
#ifdef STDC
(int k, FILE * dvi, FILE * dtl)
#else
(k, dvi, dtl)
int k;
FILE * dvi;
FILE * dtl;
#endif
/* copy string of k characters from dvi file to dtl file */
{
int i;
int ch;
fprintf (dtl, " ");
fprintf (dtl, "'");
for (i=0; i < k; i++)
{
ch = fgetc (dvi);
if (ch == ESC_CHAR || ch == EMES_CHAR)
{
fprintf (dtl, "%c", ESC_CHAR);
}
fprintf (dtl, "%c", ch);
}
fprintf (dtl, "'");
}
/* xferstring */
COUNT
special
#ifdef STDC
(FILE * dvi, FILE * dtl, int n)
#else
(dvi, dtl, n)
FILE * dvi;
FILE * dtl;
int n;
#endif
/* read special 1 .. 4 from dvi and write in dtl */
/* return number of DVI bytes interpreted into DTL */
{
U4 k;
if (n < 1 || n > 4)
{
fprintf (stderr, "%s: special %d, range is 1 to 4.\n", program, n);
exit (1);
}
fprintf (dtl, "%s%d", SPECIAL, n);
/* k[n] = length of special string */
fprintf (dtl, " ");
k = runsigned (n, dvi);
fprintf (dtl, UF4, k);
/* x[k] = special string */
xferstring (k, dvi, dtl);
return (1 + n + k);
}
/* end special */
COUNT
fontdef
#ifdef STDC
(FILE * dvi, FILE * dtl, int n)
#else
(dvi, dtl, n)
FILE * dvi;
FILE * dtl;
int n;
#endif
/* read fontdef 1 .. 4 from dvi and write in dtl */
/* return number of DVI bytes interpreted into DTL */
{
U4 ku, c, s, d, a, l;
S4 ks;
if (n < 1 || n > 4)
{
fprintf (stderr, "%s: font def %d, range is 1 to 4.\n", program, n);
exit (1);
}
fprintf (dtl, "%s%d", FONTDEF, n);
/* k[n] = font number */
fprintf (dtl, " ");
if (n == 4)
{
ks = rsigned (n, dvi);
fprintf (dtl, SF4, ks);
}
else
{
ku = runsigned (n, dvi);
fprintf (dtl, UF4, ku);
}
/* c[4] = checksum */
fprintf (dtl, " ");
c = runsigned (4, dvi);
#ifdef HEX_CHECKSUM
fprintf (dtl, XF4, c);
#else /* NOT HEX_CHECKSUM */
/* write in octal, to allow quick comparison with tftopl's output */
fprintf (dtl, OF4, c);
#endif
/* s[4] = scale factor */
fprintf (dtl, " ");
s = runsigned (4, dvi);
fprintf (dtl, UF4, s);
/* d[4] = design size */
fprintf (dtl, " ");
d = runsigned (4, dvi);
fprintf (dtl, UF4, d);
/* a[1] = length of area (directory) name */
a = runsigned (1, dvi);
fprintf (dtl, " ");
fprintf (dtl, UF4, a);
/* l[1] = length of font name */
l = runsigned (1, dvi);
fprintf (dtl, " ");
fprintf (dtl, UF4, l);
/* n[a+l] = font pathname string => area (directory) + font */
xferstring (a, dvi, dtl);
xferstring (l, dvi, dtl);
return (1 + n + 4 + 4 + 4 + 1 + 1 + a + l);
}
/* end fontdef */
COUNT
preamble
#ifdef STDC
(FILE * dvi, FILE * dtl)
#else
(dvi, dtl)
FILE * dvi;
FILE * dtl;
#endif
/* read preamble from dvi and write in dtl */
/* return number of DVI bytes interpreted into DTL */
{
U4 id, num, den, mag, k;
fprintf (dtl, "pre");
/* i[1] = DVI format identification */
fprintf (dtl, " ");
id = runsigned (1, dvi);
fprintf (dtl, UF4, id);
/* num[4] = numerator of DVI unit */
fprintf (dtl, " ");
num = runsigned (4, dvi);
fprintf (dtl, UF4, num);
/* den[4] = denominator of DVI unit */
fprintf (dtl, " ");
den = runsigned (4, dvi);
fprintf (dtl, UF4, den);
/* mag[4] = 1000 x magnification */
fprintf (dtl, " ");
mag = runsigned (4, dvi);
fprintf (dtl, UF4, mag);
/* k[1] = length of comment */
fprintf (dtl, " ");
k = runsigned (1, dvi);
fprintf (dtl, UF4, k);
/* x[k] = comment string */
xferstring (k, dvi, dtl);
return (1 + 1 + 4 + 4 + 4 + 1 + k);
}
/* end preamble */
COUNT
postamble
#ifdef STDC
(FILE * dvi, FILE * dtl)
#else
(dvi, dtl)
FILE * dvi;
FILE * dtl;
#endif
/* read postamble from dvi and write in dtl */
/* return number of bytes */
{
U4 p, num, den, mag, l, u, s, t;
fprintf (dtl, "post");
/* p[4] = pointer to final bop */
fprintf (dtl, " ");
p = runsigned (4, dvi);
fprintf (dtl, UF4, p);
/* num[4] = numerator of DVI unit */
fprintf (dtl, " ");
num = runsigned (4, dvi);
fprintf (dtl, UF4, num);
/* den[4] = denominator of DVI unit */
fprintf (dtl, " ");
den = runsigned (4, dvi);
fprintf (dtl, UF4, den);
/* mag[4] = 1000 x magnification */
fprintf (dtl, " ");
mag = runsigned (4, dvi);
fprintf (dtl, UF4, mag);
/* l[4] = height + depth of tallest page */
fprintf (dtl, " ");
l = runsigned (4, dvi);
fprintf (dtl, UF4, l);
/* u[4] = width of widest page */
fprintf (dtl, " ");
u = runsigned (4, dvi);
fprintf (dtl, UF4, u);
/* s[2] = maximum stack depth */
fprintf (dtl, " ");
s = runsigned (2, dvi);
fprintf (dtl, UF4, s);
/* t[2] = total number of pages (bop commands) */
fprintf (dtl, " ");
t = runsigned (2, dvi);
fprintf (dtl, UF4, t);
/* return (29); */
return (1 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 2);
}
/* end postamble */
COUNT
postpost
#ifdef STDC
(FILE * dvi, FILE * dtl)
#else
(dvi, dtl)
FILE * dvi;
FILE * dtl;
#endif
/* read post_post from dvi and write in dtl */
/* return number of bytes */
{
U4 q, id;
int b223; /* hope this is 8-bit clean */
int n223; /* number of "223" bytes in final padding */
fprintf (dtl, "post_post");
/* q[4] = pointer to post command */
fprintf (dtl, " ");
q = runsigned (4, dvi);
fprintf (dtl, UF4, q);
/* i[1] = DVI identification byte */
fprintf (dtl, " ");
id = runsigned (1, dvi);
fprintf (dtl, UF4, id);
/* final padding by "223" bytes */
/* hope this way of obtaining b223 is 8-bit clean */
for (n223 = 0; (b223 = fgetc (dvi)) == 223; n223++)
{
fprintf (dtl, " ");
fprintf (dtl, "%d", 223);
}
if (n223 < 4)
{
fprintf (stderr,
"%s: bad post_post: fewer than four \"223\" bytes.\n", program);
exit (1);
}
if (b223 != EOF)
{
fprintf (stderr,
"%s: bad post_post: doesn't end with a \"223\".\n", program);
exit (1);
}
return (1 + 4 + 1 + n223);
}
/* end postpost */
/* end of "dv2dt.c" */

View File

@ -0,0 +1,715 @@
.\" ====================================================================
.\" @Troff-man-file{
.\" author = "Nelson H. F. Beebe and Geoffrey Tobin",
.\" version = "0.6.0",
.\" date = "08 March 1995",
.\" time = "19:52:00 GMT +11",
.\" filename = "dv2dt.man",
.\" address = "Center for Scientific Computing
.\" Department of Mathematics
.\" University of Utah
.\" Salt Lake City, UT 84112
.\" USA",
.\" telephone = "+1 801 581 5254",
.\" FAX = "+1 801 581 4148",
.\" checksum = "32328 715 2191 12898",
.\" email = "beebe@math.utah.edu (Internet)",
.\" codetable = "ISO/ASCII",
.\" keywords = "DVI, TeX",
.\" supported = "no",
.\" docstring = "This file contains the UNIX manual pages
.\" for the dv2dt utility, a program for
.\" converting a binary TeX DVI file to an
.\" editable text representation in DTL (DVI Text
.\" Language). The companion dt2dv utility can
.\" convert the output DTL file back to a binary
.\" DVI file.
.\"
.\" The checksum field above contains a CRC-16
.\" checksum as the first value, followed by the
.\" equivalent of the standard UNIX wc (word
.\" count) utility output of lines, words, and
.\" characters. This is produced by Robert
.\" Solovay's checksum utility.",
.\" }
.\" ====================================================================
.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
.if n .ds Te TeX
.if t .ds Xe X\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'T
.if n .ds Xe XeT
.TH DV2DT 1 "08 March 1995" "Version 0.6.0"
.\"======================================================================
.SH NAME
dv2dt \- convert a binary TeX DVI file to DTL text representation
.\"======================================================================
.SH SYNOPSIS
.B dv2dt
.I input-DVI-file
.I output-DTL-file
.PP
If the filenames are omitted, then
.I stdin
and
.I stdout
are assumed.
.\"======================================================================
.SH DESCRIPTION
.B dv2dt
converts a binary \*(Te\& DVI file to an editable
text file in DTL
.RI ( "DVI Text Language" )
format. The companion
.BR dt2dv (1)
utility can convert the DTL file back to a binary
DVI file.
.\"======================================================================
.SH "DVI COMMAND DESCRIPTION"
\*(Te\& DVI files contain a compact binary
description of typeset pages, as a stream of
operation code bytes, each immediately followed by
zero or more parameter bytes. The format of DVI
files is fully described in Donald E. Knuth,
.IR "\*(Te\&: The Program" ,
Addison-Wesley (1986), ISBN 0-201-13437-3, as well
as in the
.BR dvitype (1)
literate program source code.
.PP
For convenience, we provide a summary of DVI
commands here. In the following list, operation
code bytes are given as unsigned decimal values,
followed by their symbolic names (not present in
the DVI file), and a short description. A
designation like
.I b[+n]
means that the operation code byte is followed by
a parameter
.I b
which uses
.I n
bytes, and is signed. Without the plus sign, the
parameter is unsigned. Signed integer parameter
values are always represented in two's complement
arithmetic, which is the system followed by most
computers manufactured today, including all
personal computers and workstations.
.if n .TP \w'\fI128_set1__c[1]\fP'u+3n
.if t .TP \w'\fI243_fnt_def1__k[1]_c[4]_s[4]_d[4]_a[1]_l[1]_n[a+l]\fP'u+3n
.I "0 set_char_0"
Set character 0 from current font.
.TP
.I .\|.\|.
.TP
.I "127 set_char_127"
Set character 127 from current font.
.TP
.I "128 set1 c[1]"
Set 1-byte unsigned character (uchar) number
.IR c .
.TP
.I "129 set2 c[2]"
Set 2-byte uchar number
.IR c .
.TP
.I "130 set3 c[3]"
Set 3-byte uchar number
.IR c .
.TP
.I "131 set4 c[+4]"
Set 4-byte signed character (schar) number
.IR c .
.TP
.I "132 set_rule a[+4] b[+4]"
Set rule, height
.IR a ,
width
.IR b .
.TP
.I "133 put1 c[1]"
Put 1-byte uchar
.IR c .
.TP
.I "134 put2 c[2]"
Put 2-byte uchar
.IR c .
.TP
.I "135 put3 c[3]"
Put 3-byte uchar
.IR c .
.TP
.I "136 put4 c[+4]"
Put 4-byte schar
.IR c .
.TP
.I "137 put_rule a[+4] b[+4]"
Put rule, height
.IR a ,
width
.IR b .
.TP
.I "138 nop"
Do nothing.
.TP
.I "139 bop c0[+4] .\|.\|. c9[+4] p[+4]"
Beginning of page. The parameters
.I "c0 .\|.\|. c9"
are the \*(Te\& page counters, the contents of
\*(Te\& count registers
.IR "\ecount0 .\|.\|. \ecount9" .
The parameter
.I p
is the byte offset from the beginning of the DVI
file of the previous
.I bop
operation code byte. The first such command in
the file has
.IR "p = \-1" .
.TP
.I "140 eop"
End of page.
.TP
.I "141 push"
Push
.RI ( h,v,w,x,y,z )
onto stack.
.TP
.I "142 pop"
Pop
.RI ( h,v,w,x,y,z )
from stack.
.TP
.I "143 right1 b[+1]"
Move right
.I b
units.
.TP
.I "144 right2 b[+2]"
Move right
.I b
units.
.TP
.I "145 right3 b[+3]"
Move right
.I b
units.
.TP
.I "146 right4 b[+4]"
Move right
.I b
units.
.TP
.I "147 w0"
Move right
.I w
units.
.TP
.I "148 w1 b[+1]"
Move right
.I b
units, and set
.IR "w = b" .
.TP
.I "149 w2 b[+2]"
Move right
.I b
units, and set
.IR "w = b" .
.TP
.I "150 w3 b[+3]"
Move right
.I b
units, and set
.IR "w = b" .
.TP
.I "151 w4 b[+4]"
Move right
.I b
units, and set
.IR "w = b" .
.TP
.I "152 x0"
Move right
.I x
units.
.TP
.I "153 x1 b[+1]"
Move right
.I b
units, and set
.IR "x = b" .
.TP
.I "154 x2 b[+2]"
Move right
.I b
units, and set
.IR "x = b" .
.TP
.I "155 x3 b[+3]"
Move right
.I b
units, and set
.IR "x = b" .
.TP
.I "156 x4 b[+4]"
Move right
.I b
units, and set
.IR "x = b" .
.TP
.I "157 down1 a[+1]"
Move down
.I a
units.
.TP
.I "158 down2 a[+2]"
Move down
.I a
units.
.TP
.I "159 down3 a[+3]"
Move down
.I a
units.
.TP
.I "160 down4 a[+4]"
Move down
.I a
units.
.TP
.I "161 y0"
Move right
.I y
units.
.TP
.I "162 y1 a[+1]"
Move right
.I a
units, and set
.IR "y = a" .
.TP
.I "163 y2 a[+2]"
Move right
.I a
units, and set
.IR "y = a" .
.TP
.I "164 y3 a[+3]"
Move right
.I a
units, and set
.IR "y = a" .
.TP
.I "165 y4 a[+4]"
Move right
.I a
units, and set
.IR "y = a" .
.TP
.I "166 z0"
Move right
.I z
units.
.TP
.I "167 z1 a[+1]"
Move right
.I a
units, and set
.IR "z = a" .
.TP
.I "168 z2 a[+2]"
Move right
.I a
units, and set
.IR "z = a" .
.TP
.I "169 z3 a[+3]"
Move right
.I a
units, and set
.IR "z = a" .
.TP
.I "170 z4 a[+4]"
Move right
.I a
units, and set
.IR "z = a" .
.TP
.I "171 fnt_num_0"
Set current font number
.IR "(f) = 0" .
.TP
.I .\|.\|.
.TP
.I "234 fnt_num_63"
Set
.IR "f = 63" .
.TP
.I "235 fnt1 k[1]"
Set
.IR "f = k" .
.TP
.I "236 fnt2 k[2]"
Set
.IR "f = k" .
.TP
.I "237 fnt3 k[3]"
Set
.IR "f = k" .
.TP
.I "238 fnt4 k[+4]"
Set
.IR "f = k" .
.TP
.I "239 xxx1 k[1] x[k]"
Special string
.I x
with
.I k
bytes.
.TP
.I "240 xxx2 k[2] x[k]"
Special string
.I x
with
.I k
bytes.
.TP
.I "241 xxx3 k[3] x[k]"
Special string
.I x
with
.I k
bytes.
.TP
.I "242 xxx4 k[4] x[k]"
Special string
.I x
with (unsigned)
.I k
bytes.
.TP
.I "243 fnt_def1 k[1] c[4] s[4] d[4] a[1] l[1] n[a+l]"
Define font
.IR k .
The parameters are:
.RS
.TP \w'\fIm\fP'u+3n
.I c
Checksum for TFM file.
.TP
.I s
Scale factor, in DVI units.
.TP
.I d
Design size, in DVI units.
.TP
.I a
Length of the ``area'' or directory.
.TP
.I l
Length of the font name.
.TP
.I n
Area and font name string(s).
.RE
.TP
.I "244 fnt_def2 k[2] c[4] s[4] d[4] a[1] l[1] n[a+l]"
Define font
.IR k .
.TP
.I "245 fnt_def3 k[3] c[4] s[4] d[4] a[1] l[1] n[a+l]"
Define font
.IR k .
.TP
.I "246 fnt_def4 k[+4] c[4] s[4] d[4] a[1] l[1] n[a+l]"
Define font
.IR k .
.TP
.I "247 pre i[1] num[4] den[4] mag[4] k[1] x[k]"
Begin preamble. The parameters are:
.RS
.TP \w'\fInum\fP'u+3n
.I i
DVI format. Standard \*(Te\& has
.IR "ID = 2" ,
and \*(Te\&-\*(Xe\& has
.IR "ID = 3" .
.TP
.I num
Numerator of 100 nm / DVI unit.
.TP
.I den
Denominator of 100 nm / DVI unit.
.TP
.I mag
1000 * magnification.
.TP
.I k
Comment length.
.TP
.I x
Comment string.
.RE
.TP
.I "248 post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2]"
Begin postamble. The parameters are:
.RS
.TP \w'\fInum\fP'u+3n
.I p
Pointer to final bop.
.TP
.I "num, den, mag"
Duplicates of values in preamble.
.TP
.I l
Height-plus-depth of tallest page, in DVI units.
.TP
.I u
Width of widest page, in DVI units.
.TP
.I s
Maximum stack depth needed to process this DVI file.
.TP
.I t
Total number of pages
.RI ( bop
commands) present.
.RE
.TP
.I "249 post_post q[4] i[1] 223 .\|.\|. 223"
End postamble. The parameters are:
.RS
.TP \w'\fI223\fP'u+3n
.I q
Byte offset from the beginning of the DVI file to
the
.I post
command that started the postamble.
.TP
.I i
DVI format ID, as in the preamble.
.TP
.I
223
At least four
.I 223
bytes.
.RE
.TP
.I "250"
Undefined.
.TP
.I .\|.\|.
.TP
.I "255"
Undefined.
.\"======================================================================
.SH "DTL COMMAND DESCRIPTION"
A DTL file contains one line per command, with a
limit of 1024 characters per line. Each command
contains a symbolic operation name, followed by
zero or more parameter values. The parameter
value descriptions are not repeated here; they can
be found in the previous section.
.TP \w'\fIw0,_w1,_w2,_w3,_w4\fP'u+3n
variety <variety-name>
This command specifies the name of the DTL file
type; it has no DVI file equivalent.
.TP
.I (text)
Series of set_char commands, for printable ASCII text.
.TP
.I \e(
Literal ASCII left parenthesis in (text).
.TP
.I \e)
Literal ASCII right parenthesis in (text).
.TP
.I \e\e
Literal ASCII backslash in (text).
.TP
.I \e"
Literal ASCII double quote in (text).
.TP
.I \eXY
Set_char for character with hexadecimal code XY,
not in parentheses, but by itself for readability.
.TP
.I "s1, s2, s2, s3"
Set, with (1,2,3,4)-byte charcodes.
.TP
.I sr
.IR set_rule .
.TP
.I "p1, p2, p2, p3"
Put, with (1,2,3,4)-byte charcodes.
.TP
.I pr
.IR put_rule .
.TP
.I nop
.I nop
(do nothing).
.TP
.I bop
.I bop
(beginning of page).
.TP
.I eop
.I eop
(end of page).
.TP
.I [
Push.
.TP
.I ]
Pop.
.TP
.I "r1, r2, r3, r4"
Right, with (1,2,3,4)-byte argument.
.TP
.I "w0, w1, w2, w3, w4"
As in DVI.
.TP
.I "x0, x1, x2, x3, x4"
As in DVI.
.TP
.I "d1, d2, d3, d4"
Down, with (1,2,3,4)-byte argument.
.TP
.I "y0, y1, y2, y3, y4"
As in DVI.
.TP
.I "z0, z1, z2, z3, z4"
As in DVI.
.TP
.I fn
.I fnt_num
(set current font to font number in 0 to 63).
.TP
.I "f1, f2, f3, f4"
.I fnt
(set current font to (1,2,3,4)-byte font number).
.TP
.I special
.I xxx
(special commands with (1,2,3,4)-byte string length).
.TP
.I fd
.I fnt_def
(assign a number to a named font).
.TP
.I pre
Preamble.
.TP
.I post
.I post
(begin postamble).
.TP
.I post_post
.I post_post
(end postamble).
.TP
.I opcode
Undefined DVI command (250 to 255).
.\"======================================================================
.SH "SAMPLE DTL FILE"
The following 2-line \*(Te\& file
.RS
.nf
Hello.
\ebye
.fi
.RE
when processed with the commands
.RS
.nf
tex hello.tex
dv2dt hello.dvi hello.dtl
.fi
.RE
produces this DTL file:
.RS
.nf
variety sequences-6
pre 2 25400000 473628672 1000 27 ' TeX output 1995.03.02:2334'
bop 1 0 0 0 0 0 0 0 0 0 -1
[
d3 -917504
]
d4 42152922
[
d4 -41497562
[
r3 1310720
fd1 0 11374260171 655360 655360 0 5 '' 'cmr10'
fn0
(Hello.)
]
]
d3 1572864
[
r4 15229091
(1)
]
eop
post 42 25400000 473628672 1000 43725786 30785863 2 1
fd1 0 11374260171 655360 655360 0 5 'cmr10'
post_post 152 2 223 223 223 223
.fi
.RE
The command
.RS
.nf
dt2dv hello.dtl hello.dvi
.fi
.RE
will reconstruct the original DVI file.
.\"======================================================================
.SH "SEE ALSO"
.BR dt2dv (1),
.BR dvitype (1),
.BR tex (1).
.\"======================================================================
.SH FILES
.TP \w'\fI*.dvi\fP'u+3n
.I *.dvi
binary \*(Te\& DVI file.
.TP
.I *.dtl
text representation of a \*(Te\& DVI file in
.I "DVI Text Language"
format.
.\"======================================================================
.SH AUTHOR
.B dv2dt
and
.BR dt2dv (1)
were written by
.RS
.nf
Geoffrey Tobin
Department of Electronic Engineering
La Trobe University
Bundoora, Victoria 3083
Australia
Tel: +61 3 479 3736
FAX: +61 3 479 3025
Email: <G.Tobin@ee.latrobe.edu.au>
.fi
.RE
.PP
These manual pages were primarily written by
.RS
.nf
Nelson H. F. Beebe, Ph.D.
Center for Scientific Computing
Department of Mathematics
University of Utah
Salt Lake City, UT 84112
Tel: +1 801 581 5254
FAX: +1 801 581 4148
Email: <beebe@math.utah.edu>
.fi
.RE
.\"==============================[The End]==============================

View File

@ -0,0 +1,154 @@
``dvi.doc''
Mon 27 Feb 1995
Geoffrey Tobin
Description of the DVI file structure.
--------------------------------------
Reference:
----------
CTAN: dviware/driv-standard/level-0/dvistd0.tex
"The DVI Driver Standard, Level 0",
by The TUG DVI Driver Standards Committee (now defunct)
chaired by Joachim Schrod.
Appendix A, "Device-Independent File Format",
section A.2, "Summary of DVI commands".
DVI Commands
------------
Listed in the free format:
"Opcode Symbol Parameter[Signed? Bytes] ... Action".
0 set_char_0 - set character 0 from current font
...
127 set_char_127 - set character 127 from current font
128 set1 c[1] - set 1-byte unsigned character (uchar) number c
129 set2 c[2] - set 2-byte uchar number c
130 set3 c[3] - set 3-byte uchar number c
131 set4 c[+4] - set 4-byte signed character (schar) number c
132 set_rule a[+4] b[+4] - set rule, height a, width b
133 put1 c[1] - put 1-byte uchar c
134 put2 c[2] - put 2-byte uchar
135 put3 c[3] - put 3-byte uchar
136 put4 c[+4] - put 4-byte schar
137 put_rule a[+4] b[+4] - put rule, height a, width b
138 nop - do nothing
139 bop c0[+4] ... c9[+4] p[+4] - beginning of page
140 eop - end of page
141 push - push (h,v,w,x,y,z) onto stack
142 pop - pop (h,v,w,x,y,z) from stack
143 right1 b[+1] - move right b units
144 right2 b[+2] - move right b units
145 right3 b[+3] - move right b units
146 right4 b[+4] - move right b units
147 w0 - move right w units
148 w1 b[+1] - move right b units, and set w = b
149 w2 b[+2] - move right b units, and set w = b
150 w3 b[+3] - move right b units, and set w = b
151 w4 b[+4] - move right b units, and set w = b
152 x0 - move right x units
153 x1 b[+1] - move right b units, and set x = b
154 x2 b[+2] - move right b units, and set x = b
155 x3 b[+3] - move right b units, and set x = b
156 x4 b[+4] - move right b units, and set x = b
157 down1 a[+1] - move down a units
158 down2 a[+2] - move down a units
159 down3 a[+3] - move down a units
160 down4 a[+4] - move down a units
161 y0 - move right y units
162 y1 a[+1] - move right a units, and set y = a
163 y2 a[+2] - move right a units, and set y = a
164 y3 a[+3] - move right a units, and set y = a
165 y4 a[+4] - move right a units, and set y = a
166 z0 - move right z units
167 z1 a[+1] - move right a units, and set z = a
168 z2 a[+2] - move right a units, and set z = a
169 z3 a[+3] - move right a units, and set z = a
170 z4 a[+4] - move right a units, and set z = a
171 fnt_num_0 - set current font number (f) = 0
...
234 fnt_num_63 - set f = 63
235 fnt1 k[1] - set f = k
236 fnt2 k[2] - set f = k
237 fnt3 k[3] - set f = k
238 fnt4 k[+4] - set f = k
239 xxx1 k[1] x[k] - special string x with k bytes
240 xxx2 k[2] x[k] - special string x with k bytes
241 xxx3 k[3] x[k] - special string x with k bytes
242 xxx4 k[4] x[k] - special string x with (unsigned) k bytes
243 fnt_def1 k[1] c[4] s[4] d[4] a[1] l[1] n[a+l] - define font k
244 fnt_def2 k[2] c[4] s[4] d[4] a[1] l[1] n[a+l] - define font k
245 fnt_def3 k[3] c[4] s[4] d[4] a[1] l[1] n[a+l] - define font k
246 fnt_def4 k[+4] c[4] s[4] d[4] a[1] l[1] n[a+l] - define font k
247 pre i[1] num[4] den[4] mag[4] k[1] x[k] - begin preamble
248 post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2] - begin postamble
249 post_post q[4] i[1] 223 ... 223 - end postamble
250 - undefined
...
255 - undefined
In bop:
c0[+4] ... c9[+4] = page counters, \`a la TeX.
p[+4] = pointer to previous bop (its byte address); first bop has p = -1 .
In the font definitions:
c[4] = check sum for TFM file.
s[4] = scale factor, in DVI units.
d[4] = design size, in DVI units.
a[1] = length of the "area" or directory.
l[1] = length of the font name.
n[a+l] = area and font name string(s).
In the preamble:
i[1] = DVI format ID = 2, except TeX-XeT has 3.
num[4] = numerator of 100 nm / DVI unit.
den[4] = denominator of 100 nm / DVI unit.
mag[4] = 1000 * magnification.
k[1] = comment length.
x[k] = comment string.
In the postamble:
p[4] = pointer to final bop.
num[4], den[4], mag[4] = duplicates of values in preamble.
l[4] = height-plus-depth of tallest page, in DVI units.
u[4] = width of widest page, in DVI units.
s[2] = maximum stack depth needed to process this DVI file.
t[2] = total number of pages (bop commands) present.
In the post-postamble:
q[4] = pointer to the "post" command that started the postamble.
i[1] = DVI format ID, as in the preamble.
223 ... 223 = at least four "223" bytes.
---------------
EOF ``dvi.doc''
---------------

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,232 @@
% This is the TeX source file for the "TeXnical Typesetting" document.
% Notice how you can put in comments? If TeX sees a % it simply ignores
% the rest of the line.
% A4 paper is 8.3in wide and 11.7in high; we set the page dimensions so that
% there are 1in margins all around:
\hsize 6.3in % page width
\vsize 9.7in % page height
\parskip 8pt plus 2pt minus 1pt % glue before a paragraph
% Define a few extra fonts for later use:
\font\bigrm=cmr10 scaled\magstep4 % big version of the standard roman font
\font\ninerm=cmr9 % 9pt roman
\font\fiverm=cmr5 % 5pt roman
\font\sm=cmcsc10 % caps and small caps
\font\ss=cmss10 % sans serif
% Here's a macro that we'll use to produce all subheadings:
\def\subhead#1{\bigskip % extra glue before subheading
\noindent{\bf #1}\par % unindented boldface subheading
\nobreak} % prevent a page break after subheading
\centerline{\bigrm \TeX nical Typesetting}
\vskip 2.5cm % dimensions can be metric
\subhead{What is \TeX?}
\TeX\ (pronounced ``teck'') is a computerized typesetting system developed by
Donald Knuth and others at Stanford University. It is used to create
high-quality documents, particularly those containing mathematics.
The name \TeX\ is an uppercase form of the Greek letters $\tau\epsilon\chi$,
the first three letters of a Greek word meaning {\sl art} as well as
{\sl technology}.
The lowering of the ``E'' is a reminder that \TeX\ is about typesetting,
which can be thought of as the next stage beyond word processing.
On devices where such lowering is difficult or impossible you may see \TeX\
written as {\tt TeX}.
% the above blank line ends the first paragraph
Most word processors allow you to
create and modify a document interactively --- what
you see on the screen is usually what your output will look like.
\TeX\ does {\it not} work in this way.
Like other typesetting systems (such as SCRIBE and
{\sl troff\/}), \TeX\ is known as a ``document compiler''. Using your
favourite text editor you need to create a file containing the
text of your manuscript along with the \TeX\ typesetting commands.
\TeX\ gives you the ability to produce printed matter with a quality
matching that found in books, depending on the output device.
Adelaide University has an {\sm imagen} laser printer
with a resolution of 240 dots per inch.
This publication shows both the capabilities of \TeX\ and
the output quality of the laser printer.
\subhead{Fonts}
One of the more obvious advantages of \TeX\ is the large range of fonts from
which you can choose. A font is a collection of characters each having a
similar size and style. Some of the fonts currently available include:
$$ % enter display math mode just to get space above and below \line
\line
{\hfil % infinitely stretchable glue
\rm roman\hfil \sl slanted\hfil \it italic\hfil \bf boldface\hfil
\tt typewriter\hfil \ss sans serif\hfil \sm small caps\hfil
} % take care to ensure each { has a matching }
$$
Many of these also come in a variety of sizes:
$$
\centerline{{\bigrm from the very big},~ % extra space after comma
{\ninerm to the very small},~
{\fiverm to the ridiculous}.}
$$
Apart from a large selection of mathematical symbols,
many special characters and accents are available:
$$
\vbox
{\tabskip 10pt plus 1fil % glue before and after all columns
\halign to\hsize
{& \hfil#\hfil\cr % specify a variable number of centred columns
\copyright& \it\$& \S& \P& \dag& \ddag&
$\circ$& $\bigcirc$& % some symbols must be accessed from math mode
$\leftarrow$& $\rightarrow$& $\triangle$& $\clubsuit$&
\`a& \'e& \c c& \^o& \"u\cr
}
}
$$
\TeX\ does a few subtle things automatically.
Certain sequences of characters in your text will
be replaced by {\sl ligatures} in the printed output (consider the ``{\tt ffi}''
in ``difficult''), while other pairs of characters need to be {\sl kerned}
(e.g., the ``o'' and ``x'' in ``box'' look better if they are moved closer
together). The range and quality of fonts available will continue to improve.
\subhead{Mathematics}
A major design goal of \TeX\ was to simplify the task of typesetting
mathematics --- and to do it properly. Mathematicians will be pleasantly
surprised at the ease with which formulae and expressions can be created;
from simple in-line equations
such as $e^{i\pi}=-1$ and $f_{n+2}=f_{n+1}+f_n$, to more extravagant displays:
$$
\sum_{k\ge1} \sqrt{x_k-\ln k}\quad\ne\quad
\int_{0}^\infty {e^{-x^3}+\sqrt{x} \over \left(123-x\right)^3} \,dx
$$
\TeX\ looks after most of the nitty gritty details, such as spacing things
correctly and choosing the right sizes for superscripts, parentheses,
square root signs etc. (The discoverer of the above relation wishes to
remain anonymous.)
\subhead{Alignment}
The preparation of tabular material such as in lists and matrices can be a
tedious job for a person armed only with a typewriter and a bottle of
correction fluid. With a little help from \TeX, computers can make it so
much easier:
$$
\vcenter % a vertically centred \vbox
{\tabskip 0pt % no space before column 1
\halign to 3.5in % width of table
{\strut#& % col 1 is a strut
\vrule#\tabskip .5em plus2em& % col 2 is a vrule; also set col spacing
#\hfil& % col 3 is left justified
\vrule#& % col 4 is a vrule
\hfil#\hfil& % col 5 is centred
\vrule#& % col 6 is a vrule
\hfil#& % col 7 is right justified
\vrule#\tabskip 0pt % col 8 is a vrule; no space after it
\cr % end of the preamble
\noalign{\hrule}
& & \multispan5 \hfil Oldest players to represent\hfil& \cr
& & \multispan5 \hfil England in a Test Match\hfil& \cr
\noalign{\hrule}
& & \omit\hfil Name\hfil& & % \omit ignores template in preamble
\omit\hfil Age\hfil& &
\omit\hfil Versus\hfil& \cr
\noalign{\hrule}
& & W.Rhodes& & 52y 165d& & West Indies, 1930& \cr
\noalign{\hrule}
& & W.G.Grace& & 50y 320d& & Australia, 1899& \cr
\noalign{\hrule}
& & G.Gunn& & 50y 303d& & West Indies, 1929& \cr
\noalign{\hrule}
& & J.Southerton{\ninerm*}& & 49y 139d& & Australia, 1877& \cr
\noalign{\hrule\smallskip}
& \multispan7\ninerm* (This was actually his Test debut.)\hfil \cr
}
}
\hskip .5in % space between table and matrix
A=\pmatrix % parenthesized matrix
{a_{11}& a_{12}& \ldots& a_{1n}\cr
a_{21}& a_{22}& \ldots& a_{2n}\cr
\vdots& \vdots& \ddots& \vdots\cr
a_{m1}& a_{m2}& \ldots& a_{mn}\cr
}
$$
\vskip -\the\belowdisplayskip % avoid too much space below display
\subhead{Other features}
Space does not permit examples of all the things \TeX\ can do. Here are some
more features you might like to know about:
\item{$\bullet$}
Multi-column output can be generated.
{\parskip=0pt % temporarily turn off the skipping between paragraphs
\item{$\bullet$}
\TeX\ has a very sophisticated paragraph building algorithm and rarely needs
to resort to hyphenation. Paragraphs can be indented and shaped in many
different ways.
\item{$\bullet$}
Automatic insertion of footnotes,\footnote{\dag}{\ninerm Here is
a footnote.} running heads, page numbers etc.
\item{$\bullet$}
\TeX\ makes provision for generating a table of contents, a bibliography, even
an index. Automatic section numbering and cross referencing are also possible.
\item{$\bullet$}
A powerful macro facility is built into \TeX. This lets you do some very
useful things, like creating an abbreviation for a commonly used phrase, or
defining a new command that will have varying effects depending on the
parameters it is given. A macro package can enhance \TeX\ by making it much
easier to generate a document in a predefined format.
\par % end the last paragraph BEFORE ending the group
} % \parskip will now revert to its previous value
\subhead{What CAN'T \TeX\ do?}
Complex graphics such as diagrams and illustrations pose
a major problem --- at the moment you have to leave an appropriate amount of
blank space and paste them in later.
Graphic facilities are the subject of current research.
\subhead{\TeX\ and VAX/VMS}
The \TeX\ source file used to generate this document is available for
inspection on any VAX node that has \TeX ---
just type `{\tt scroll tex\char'137 inputs:example.tex}'.
A few steps are needed to print such a file:
\item{(1)}
Type `{\tt tex example}' to ``compile'' the file.
(\TeX\ looks for a {\tt .tex} file by default. If it can't find the given
file in your current directory it will look in {\tt tex\char'137 inputs}.)
Two new files will be created in your current directory:
{\tt example.dvi} and {\tt example.lis}.
The former is a device independent description of the document;
the latter is simply a log of the \TeX\ run.
{\parskip=0pt % temporarily turn off \parskip
\item{(2)}
Type `{\tt dvitovdu example}' to preview the document on a terminal screen.
This program can be used to detect a variety of formatting problems,
saving both time and paper.
\item{(3)}
Type `{\tt imprint example}' to print the document.
(Note that the DVIto\kern-.15em VDU and IMPRINT commands
accept a {\tt .dvi} file by default).
} % restore \parskip
Detailed help on all these commands is available on-line --- try typing
`{\tt help tex}' to get started.
\bye

View File

@ -0,0 +1,2 @@
Hello.
\bye

View File

@ -0,0 +1,36 @@
#!/bin/sh
# Filter for converting "troff -mxx" to PostScript. This script is
# normally linked to the names man2ps, ms2ps, me2ps, and mm2ps.
#
# Usage:
# man2ps [<] cc.1 >cc.ps
# me2ps [<] foo.me >foo.ps
# mm2ps [<] foo.mm >foo.ps
# ms2ps [<] foo.ms >foo.ps
#
# [08-May-1993]
# Choose a troff format according to the scrip name.
case `basename $0` in
man*) FORMAT=-man ;;
me*) FORMAT=-me ;;
mm*) FORMAT=-mm ;;
ms*) FORMAT=-ms ;;
*) echo "Unknown troff format:" ; exit 1 ;;
esac
# We can use either GNU groff or Sun Solaris troff + dpost
if [ -x /usr/local/bin/groff ]
then # GNU groff
TROFF="groff $FORMAT"
TROFF2PS="cat"
elif [ -x /usr/lib/lp/postscript/dpost ]
then # Solaris 2.1
TROFF="troff $FORMAT"
TROFF2PS="/usr/lib/lp/postscript/dpost"
else
echo "Cannot find troff-to-PostScript filter"
exit 1
fi
tbl $* | eqn | $TROFF | $TROFF2PS

View File

@ -0,0 +1,279 @@
% TeX source file for creating TRIPVDU.DVI, a torture file for DVItoVDU
% (using the same philosophy as Donald Knuth's torture test for TeX).
\nopagenumbers
\topskip 0pt
\parindent 0pt
\parskip 0pt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 1
% This page is completely empty but has some \special stuff.
\message{Empty page.}
\null
\special{DVItoVDU should warn user that it is ignoring this stuff.}
\special{And this.}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 2
% This page has 1 black pixel at (0,0).
\message{1 black pixel at (0,0).}
\hrule height 1sp width 1sp depth 0sp
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 3
% This page will fill an A4 sheet with black pixels, assuming A4 paper is
% 8.3in by 11.7in and (0,0) is 1in from the top and left edges.
\message{A4 sheet full of black pixels.}
{% change page size and location temporarily
\hsize 10in
\vsize 12in
\hoffset -1in
\voffset -1in
% Because ref pts of rules are at BOTTOM left corner we first need to output
% a rule that will guarantee Minv = -1in, then output the large rule with
% slightly less than A4 height.
\hrule height 1sp width 8.299in depth 0sp
\hrule height 11.695in width 8.299in depth 0sp
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 4
% This page is 1 pixel wider than page 3.
% DVItoVDU should detect that page is too wide for A4 paper.
\message{As above but 1 pixel too wide.}
\hrule height 1sp width 8.301in depth 0sp
\hrule height 11.695in width 8.301in depth 0sp
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 5
% This page is 1 pixel longer than page 3.
% DVItoVDU should detect that page is too low for A4 paper.
\message{As above but 1 pixel too low.}
\hrule height 11.701in width 8.299in depth 0sp
\vfil\eject
}% reset page size and location
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 6
% This page has a rulelist with a full ruletable (= 300 rules).
% Note that DVItoVDU does not impose any limits
% on the number of rules or characters in a page. Pages 6 to 9
% test the list manipulating code in DVIReader and DVItoVDU.
\message{Page with ruletablesize rules.}
\newcount\temp
\temp=300
\loop\ifnum\temp>0
\hrule height 1sp width \hsize % 1 pixel high
\vfil
\advance\temp by -1
\repeat
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 7
% This page has ruletablesize+1 rules (so rulelist has 2 nodes).
\message{Page with ruletablesize+1 rules.}
\temp=301
\loop\ifnum\temp>0
\hrule height 1sp width \hsize % 1 pixel high
\vfil
\advance\temp by -1
\repeat
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 8
% This page has a charlist with a full chartable (= 3000 characters).
\message{Page with chartablesize characters from one font.}
\font\small=cmr5
{\small \offinterlineskip
\temp=30
\loop\ifnum\temp>0
\leftline{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii} % 100 chars
\advance\temp by -1
\repeat
}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 9
% This page has chartablesize+1 characters (so charlist has 2 nodes).
\message{Page with chartablesize+1 characters from one font.}
{\small \offinterlineskip
\temp=30
\loop\ifnum\temp>0
\leftline{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii} % 100 chars
\advance\temp by -1
\repeat
\leftline{i} % the extra character
}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 10
\message{Multiple TeX page counters.}
\footline={\hss\tenrm\folio\hss} % turn on page numbers
\pageno=0
\count1=1 \count2=2 \count3=3 \count4=4 \count9=9
\noindent
This is \TeX\ page [0.1.2.3.4.....9].
\vfil\eject
\count1=0 \count2=0 \count3=0 \count4=0 \count9=0 % reset TeX counters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 11
\message{Negative TeX page.}
\pageno=-11
\noindent
This is \TeX\ page [-11].
\vfil\eject
\pageno=12 % DVI page = TeX page again
\nopagenumbers % turn off page numbers again
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 12
% This page has characters from many fonts.
% Note that the page is off the right edge of A4 paper.
\message{Page with characters from many fonts.}
% avoid redefining plain TeX's \i, \j etc.
\font\Fb=cmr5
\font\Fc=cmr5 scaled\magstep5
\font\Fe=cmr10 scaled\magstep5
\font\Fg=cmbx10
\font\Fh=cmbx10 scaled\magstep5
\font\Fj=cmsl10
\font\Fk=cmsl10 scaled\magstep5
\font\Fm=cmtt10
\font\Fn=cmtt10 scaled\magstep5
\font\Fo=cmss10
\font\Fp=cmcsc10
\font\Fq=cmdunh10
\leftline{\Fb These characters are from CMR5 at mag 1000.}
\leftline{\Fc These characters are from CMR5 at mag 2488.}
\leftline{\tenrm These characters are from CMR10 at mag 1000.}
\leftline{\Fe These characters are from CMR10 at mag 2488.}
\leftline{\Fg These characters are from CMBX10 at mag 1000.}
\leftline{\Fh These characters are from CMBX10 at mag 2488.}
\leftline{\Fj These characters are from CMSL10 at mag 1000.}
\leftline{\Fk These characters are from CMSL10 at mag 2488.}
\leftline{\Fm These characters are from CMTT10 at mag 1000.}
\leftline{\Fn These characters are from CMTT10 at mag 2488.}
\leftline{\Fo These characters are from CMSS10 at mag 1000.}
\leftline{\Fp These characters are from CMCSC10 at mag 1000.}
\leftline{\Fq These characters are from CMDUNH10 at mag 1000.}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 13
% This page has characters from many fonts, some of which have no corresponding
% PXL file. DVItoVDU should warn user about non-existent font files and
% continue as best it can by loading dummy font info.
% Note that the page is off the right edge of A4 paper.
\message{Page with characters from fonts at unknown magnifications.}
% PXL files do not exist at the requested magnifications:
\font\Fr=cmr5 scaled 500
\font\Fs=cmr5 scaled 3000
\font\Ft=cmr10 scaled 200
\font\Fu=cmr10 scaled 5000
\font\Fv=cmsl10 scaled 49
\font\Fw=cmsl10 scaled 10000
\leftline{\Fr CMR5 at mag 500 does not exist.}
\leftline{\Fb These characters are from CMR5 at mag 1000.}
\leftline{\Fs CMR5 at mag 3000 does not exist.}
\leftline{\Ft CMR10 at mag 200 does not exist.}
\leftline{\tenrm These characters are from CMR10 at mag 1000.}
\leftline{\Fu CMR10 at mag 5000 does not exist.}
\leftline{\Fv CMSL10 at mag 49 does not exist.}
\leftline{\Fj These characters are from CMSL10 at mag 1000.}
\leftline{\Fw CMSL10 at mag 10000 does not exist.}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 14
% This page has a paragraph illustrating most of the characters from the
% standard roman TeX text font.
\message{Standard paragraph.}
\rm
Our task is to create a paragraph illustrating what a typical piece of text
looks like in the standard \TeX\ font. It should be stressed that not all
\TeX\ fonts can be used for typesetting text. We need to show most of the
characters in this font---for instance, something like ``the quick brown fox
jumps over a lazy dog'' would use all the lower-case letters. Hmmm \dots\
how about ``THE QUICK BROWN FOX JUMPS OVER 9876543210 LAZY DOGS'' to make
sure we show all the upper-case letters and digits? Such a paragraph would
hardly be typical! Then there's ligatures (try and fit in words like
fluffy, waffle, firefly, difficult) and examples of kerning (boxer, cooked,
vowel). Not to mention the various accents and other special letters:
prot\'eg\'e, r\^ole, na\"\i ve, \AE sop's \OE vres en fran\c cais.
But how do we put all this stuff into a paragraph that makes sense!?
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 15
\message{Page in bottom half of A4 paper.}
\null\vfil
\centerline{Page in bottom half of A4 paper.}
\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 16
\message{Page completely above left of A4 paper.}
\voffset -3in
\hoffset -9in
\leftline{Page completely above left of A4 paper.}
\vfil\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 17
\message{Page completely below right of A4 paper.}
\voffset 3in
\hoffset 9in
\null\vfil
\rightline{Page completely below right of A4 paper.}
\eject
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DVI page 18
\message{Page beyond all edges of A4 paper.}
\voffset -3in
\hoffset -3in
\vsize 15in
\hsize 15in
\line{Page beyond all edges of A4 paper.\hfil
Page beyond all edges of A4 paper.}
\vfil
\line{Page beyond all edges of A4 paper.\hfil
Page beyond all edges of A4 paper.}
\eject
\voffset 0in \hoffset 0in % offsets back to normal
\bye

View File

@ -0,0 +1,433 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
id="svg1"
sodipodi:version="0.32"
inkscape:version="0.39cvs"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="128.00000pt"
height="128.00000pt"
sodipodi:docbase="/home/andy/Desktop/etiquette-icons-0.4/scalable/apps"
sodipodi:docname="TeX.svg">
<defs
id="defs3">
<linearGradient
id="linearGradient1806">
<stop
style="stop-color:#000000;stop-opacity:0.40677965;"
offset="0.0000000"
id="stop1807" />
<stop
style="stop-color:#000000;stop-opacity:0.073446326;"
offset="0.64777780"
id="stop3276" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1808" />
</linearGradient>
<linearGradient
id="linearGradient1518">
<stop
style="stop-color:#ffffff;stop-opacity:0.74226803;"
offset="0.0000000"
id="stop1519" />
<stop
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1520" />
</linearGradient>
<linearGradient
id="linearGradient1512">
<stop
style="stop-color:#000000;stop-opacity:0.54639173;"
offset="0.0000000"
id="stop1513" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1514" />
</linearGradient>
<pattern
width="130.00000"
height="96.000000"
id="pattern903">
<image
xlink:href="/home/andy/Desktop/lux.png"
sodipodi:absref="/home/andy/Desktop/lux.png"
width="130.00000"
height="96.000000"
id="image904" />
</pattern>
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1515"
x1="0.14117648"
y1="0.17073171"
x2="0.74117649"
y2="0.45121950" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1517"
x1="0.56209153"
y1="-3.2146594e-17"
x2="0.56862748"
y2="0.64843750" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1522"
x1="0.34108528"
y1="1.0468750"
x2="0.33333334"
y2="0.46093750" />
<radialGradient
xlink:href="#linearGradient1518"
id="radialGradient1524" />
<radialGradient
xlink:href="#linearGradient1518"
id="radialGradient1525" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1527"
x1="0.99291223"
y1="0.38505521"
x2="-0.12118133"
y2="0.38729247" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1529"
x1="0.99346405"
y1="1.6406250"
x2="0.71241832"
y2="0.62500000" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1531"
x1="0.92941177"
y1="0.35714287"
x2="0.32629615"
y2="0.35714287" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1533"
x1="0.69879520"
y1="0.61718750"
x2="0.44176707"
y2="0.32812500" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1535"
x1="0.0039215689"
y1="0.94642860"
x2="0.45490196"
y2="0.58928573" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1537"
x1="0.33070865"
y1="1.2265625"
x2="0.43307087"
y2="0.42968750" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1539"
x1="0.16788322"
y1="1.0312500"
x2="0.63503647"
y2="0.45312500" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1659"
x1="0.40458015"
y1="1.3828125"
x2="0.35877863"
y2="0.54687500" />
<radialGradient
xlink:href="#linearGradient1806"
id="radialGradient1977"
cx="0.50000000"
cy="0.50000000"
r="0.50000000"
fx="0.50000000"
fy="0.50000000" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1734"
x1="0.67319918"
y1="0.99825197"
x2="0.47887364"
y2="0.30443147"
gradientTransform="scale(0.906215,1.103491)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0000000"
inkscape:pageshadow="2"
inkscape:zoom="1.2279853"
inkscape:cx="57.933129"
inkscape:cy="15.420322"
inkscape:window-width="420"
inkscape:window-height="491"
inkscape:window-x="97"
inkscape:window-y="125" />
<g
id="g1540"
transform="matrix(1.429413,-3.932010e-2,3.932010e-2,1.429413,6.816050,14.52049)"
style="">
<path
style="fill:#212121;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 24.859391,31.907937 C 23.419824,24.350211 24.964801,11.778293 30.054438,8.9789918 C 35.144076,6.1796912 40.379124,5.3034583 41.760605,9.7424375 C 43.243834,14.508354 39.448349,16.768623 34.704351,20.597833 C 29.745701,24.600304 28.340109,28.103497 24.859391,31.907937 z "
id="path917"
sodipodi:nodetypes="cczzc" />
</g>
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1977);fill-opacity:0.75000000;fill-rule:evenodd;stroke-width:1.0000000pt;"
id="path1976"
sodipodi:cx="41.875938"
sodipodi:cy="37.865574"
sodipodi:rx="12.562782"
sodipodi:ry="12.562782"
d="M 54.438721 37.865574 A 12.562782 12.562782 0 1 0 29.313156,37.865574 A 12.562782 12.562782 0 1 0 54.438721 37.865574 z"
transform="matrix(6.757552,0.000000,0.000000,3.357903,-212.4401,-10.33593)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1977);fill-opacity:0.75000000;fill-rule:evenodd;stroke-width:1.0000000pt;"
id="path1724"
sodipodi:cx="41.875938"
sodipodi:cy="37.865574"
sodipodi:rx="12.562782"
sodipodi:ry="12.562782"
d="M 54.438721 37.865574 A 12.562782 12.562782 0 1 0 29.313156,37.865574 A 12.562782 12.562782 0 1 0 54.438721 37.865574 z"
transform="matrix(6.757552,0.000000,0.000000,3.357903,-196.6048,-24.73160)" />
<path
style="fill:#618bb4;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 25.193706,48.176692 C 25.193706,48.176692 24.939224,26.545733 44.025365,23.491950 C 63.111506,20.438168 70.109757,49.449102 68.710107,54.029776 C 67.310457,58.610450 49.351398,70.044503 37.645232,66.227275 C 25.939066,62.410047 26.975079,57.338040 25.193706,48.176692 z "
id="path918"
sodipodi:nodetypes="cczcc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1529);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.074289,48.939744 C 28.074289,48.939744 27.844841,29.436670 45.053436,26.683294 C 62.262031,23.929920 69.374917,51.234223 67.309886,54.217047 C 65.244854,57.199869 51.477978,62.247724 40.923373,58.806005 C 30.368769,55.364286 29.680425,57.199869 28.074289,48.939744 z "
id="path1528"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1517);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 25.891950,48.915464 C 25.891950,48.915464 25.637468,27.284505 44.723609,24.230722 C 63.809750,21.176940 71.698688,51.460283 69.408351,54.768548 C 67.118014,58.076812 51.849101,63.675413 40.142935,59.858185 C 28.436769,56.040957 27.673323,58.076812 25.891950,48.915464 z "
id="path1516"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#a2360f;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 40.717100,73.115916 C 40.717100,68.916965 50.070907,54.562023 54.040131,54.343356 C 58.099053,54.119748 55.986013,56.829076 59.039796,56.574594 C 62.093578,56.320112 67.183216,56.574594 68.201143,59.882859 C 69.219071,63.191123 69.473553,72.606953 66.165288,73.370398 C 62.857024,74.133844 60.057723,74.897290 58.276350,77.442108 C 56.494977,79.986927 51.150858,84.567601 46.061220,82.277264 C 41.078519,80.035049 40.717100,77.314867 40.717100,73.115916 z "
id="path916"
sodipodi:nodetypes="czcccczz"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#e7d417;fill-opacity:0.44654086;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 47.842593,75.406253 C 48.097075,73.879362 50.387412,62.936641 53.186712,61.155268 C 55.986013,59.373895 54.204640,62.936641 55.222568,64.718014 C 56.240495,66.499388 61.330133,59.373895 61.330133,62.427678 C 61.330133,65.481460 56.749459,67.517315 59.803241,67.008351 C 62.857024,66.499388 71.254926,63.954569 66.928734,67.262833 C 62.602542,70.571098 60.312205,75.406253 57.258423,73.879362 C 54.204640,72.352471 53.186712,77.187626 50.641894,77.187626 C 48.097075,77.187626 47.588111,77.187626 47.842593,75.406253 z "
id="path922"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1537);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 40.983128,72.559266 C 40.983128,68.360315 50.336933,54.005373 54.306163,53.786706 C 58.365083,53.563098 56.252043,56.272426 59.305823,56.017944 C 62.359603,55.763462 67.449243,56.017944 68.467173,59.326209 C 69.485103,62.634473 69.739583,72.050303 66.431313,72.813748 C 63.123053,73.577194 60.323753,74.340640 58.542383,76.885458 C 56.761003,79.430277 51.416883,84.010951 46.327253,81.720614 C 41.344547,79.478399 40.983128,76.758217 40.983128,72.559266 z "
id="path1536"
sodipodi:nodetypes="czcccczz"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1515);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 51.150857,44.868428 L 78.634900,52.757366 L 100.26586,36.979490 L 51.150857,44.868428 z "
id="path910"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#bd3200;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 50.387412,44.359464 L 100.26586,30.108479 L 76.344563,49.194620 L 50.387412,44.359464 z "
id="path909"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:#f4f4f4;fill-rule:evenodd;stroke-width:0.47612661;"
id="path914"
sodipodi:cx="61.584614"
sodipodi:cy="30.108479"
sodipodi:rx="8.9068661"
sodipodi:ry="8.9068661"
d="M 70.491480 30.108479 A 8.9068661 8.9068661 0 1 0 52.677748,30.108479 A 8.9068661 8.9068661 0 1 0 70.491480 30.108479 z"
transform="matrix(1.726901,0.000000,0.000000,1.726901,-13.97865,2.029577)" />
<path
style="fill:#a2360f;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 27.993007,55.556667 C 27.993007,55.556667 27.484043,58.355967 29.774380,60.900786 C 32.064717,63.445605 41.480546,72.097989 38.172282,77.187626 C 34.864017,82.277264 26.211633,82.786228 23.157851,79.223481 C 20.104068,75.660735 8.9068657,71.080061 9.1613476,69.298688 C 9.4158295,67.517315 5.0896376,58.610449 11.960648,58.101486 C 18.831659,57.592522 23.412333,53.011848 25.448188,52.757366 C 27.484043,52.502884 28.247488,53.775294 27.993007,55.556667 z "
id="path915"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#e7d417;fill-opacity:0.42767295;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 26.211633,61.409750 C 26.211633,61.409750 28.756452,67.517315 31.301271,70.825580 C 33.846090,74.133844 30.537825,78.714518 27.229561,75.660735 C 23.921297,72.606953 13.487540,70.316616 13.742021,67.262833 C 13.996503,64.209051 18.322695,69.807652 19.086141,67.262833 C 19.849586,64.718014 13.996503,58.864931 17.050286,59.628377 C 20.104068,60.391823 22.394405,68.026279 23.157851,63.700087 C 23.921297,59.373895 22.903369,55.556667 26.211633,61.409750 z "
id="path921"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1539);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.286502,55.412556 C 28.286502,55.412556 27.777538,58.211856 30.067875,60.756675 C 32.358212,63.301494 41.774041,71.953878 38.465777,77.043515 C 35.157512,82.133153 26.505128,82.642117 23.451346,79.079370 C 20.397563,75.516624 9.2003609,70.935950 9.4548429,69.154577 C 9.7093249,67.373204 5.3831329,58.466338 12.254143,57.957375 C 19.125154,57.448411 23.705828,52.867737 25.741683,52.613255 C 27.777538,52.358773 28.540983,53.631183 28.286502,55.412556 z "
id="path1538"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:#e4d66e;fill-rule:evenodd;stroke-width:0.59175676;"
id="path1510"
sodipodi:cx="61.584614"
sodipodi:cy="30.108479"
sodipodi:rx="8.9068661"
sodipodi:ry="8.9068661"
d="M 70.491480 30.108479 A 8.9068661 8.9068661 0 1 0 52.677748,30.108479 A 8.9068661 8.9068661 0 1 0 70.491480 30.108479 z"
transform="matrix(1.389462,0.000000,0.000000,1.389462,7.172151,12.65069)" />
<path
sodipodi:type="arc"
style="fill-rule:evenodd;stroke-width:0.57499999;"
id="path912"
sodipodi:cx="61.584614"
sodipodi:cy="31.126406"
sodipodi:rx="5.8530831"
sodipodi:ry="5.8530831"
d="M 67.437697 31.126406 A 5.8530831 5.8530831 0 1 0 55.731531,31.126406 A 5.8530831 5.8530831 0 1 0 67.437697 31.126406 z"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.286480,10.63843)" />
<path
style="fill:#45800c;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 25.957152,48.431174 C 25.957152,48.431174 31.810235,47.922210 29.774380,50.975993 C 27.738525,54.029776 20.867514,55.047703 25.193706,56.320112 C 29.519898,57.592522 52.423267,58.101486 54.968086,59.373895 C 57.512904,60.646304 50.132930,68.535243 45.297774,67.008351 C 40.462619,65.481460 33.591608,59.119413 26.466115,60.137341 C 19.340623,61.155268 12.469612,65.226978 12.215130,60.900786 C 11.960648,56.574594 17.559250,49.703584 25.957152,48.431174 z "
id="path919"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1535);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.123743,46.722923 C 28.123743,46.722923 33.733476,46.235120 31.782264,49.161938 C 29.831053,52.088756 23.245714,53.064361 27.392038,54.283868 C 31.538363,55.503375 53.489492,55.991179 55.928506,57.210685 C 58.367520,58.430192 51.294379,65.991137 46.660251,64.527728 C 42.026124,63.064320 35.440785,56.966784 28.611545,57.942390 C 21.782305,58.917995 15.196966,62.820418 14.953065,58.674094 C 14.709163,54.527769 20.074995,47.942431 28.123743,46.722923 z "
id="path1534"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#52980f;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 68.710107,53.011848 C 68.710107,53.011848 77.616973,55.811149 72.272853,56.829076 C 66.928734,57.847004 53.695676,56.574594 49.878448,59.119413 C 46.061220,61.664232 41.735028,69.807652 44.788811,71.334543 C 47.842593,72.861435 55.986013,64.209051 63.111506,62.936641 C 70.236998,61.664232 85.505911,62.427678 86.269357,59.882859 C 87.032802,57.338040 72.447502,49.641836 69.648201,49.641836 C 66.848901,49.641836 68.710107,53.011848 68.710107,53.011848 z "
id="path920"
sodipodi:nodetypes="cccccccc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient1522);fill-rule:evenodd;stroke-width:0.62365168;"
id="path1523"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.150857 35.452599 A 9.1613474 9.1613474 0 1 0 32.828162,35.452599 A 9.1613474 9.1613474 0 1 0 51.150857 35.452599 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,36.93339,7.749206)" />
<path
sodipodi:type="arc"
style="fill:#f4f4f4;fill-rule:evenodd;stroke-width:0.49186331;"
id="path923"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.150857 35.452599 A 9.1613474 9.1613474 0 1 0 32.828162,35.452599 A 9.1613474 9.1613474 0 1 0 51.150857 35.452599 z"
transform="matrix(1.671651,0.000000,0.000000,1.671651,-3.918064,5.232760)" />
<path
sodipodi:type="arc"
style="fill:#e4d66e;fill-rule:evenodd;stroke-width:0.62365168;"
id="path913"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.150857 35.452599 A 9.1613474 9.1613474 0 1 0 32.828162,35.452599 A 9.1613474 9.1613474 0 1 0 51.150857 35.452599 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,11.09669,17.21056)" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient1522);fill-rule:evenodd;stroke-width:0.62365168;"
id="path1521"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.150857 35.452599 A 9.1613474 9.1613474 0 1 0 32.828162,35.452599 A 9.1613474 9.1613474 0 1 0 51.150857 35.452599 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,11.09667,16.84664)" />
<path
sodipodi:type="arc"
style="fill-rule:evenodd;stroke-width:0.57499999;"
id="path911"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.351557 36.216045 A 6.1075649 6.1075649 0 1 0 36.136427,36.216045 A 6.1075649 6.1075649 0 1 0 48.351557 36.216045 z"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.971427,11.22306)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1524);fill-rule:evenodd;stroke-width:1.1081090;"
id="path1509"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.351557 36.216045 A 6.1075649 6.1075649 0 1 0 36.136427,36.216045 A 6.1075649 6.1075649 0 1 0 48.351557 36.216045 z"
transform="matrix(1.099494,0.000000,0.000000,1.099494,18.05623,20.13574)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1525);fill-rule:evenodd;stroke-width:1.1081090;"
id="path1511"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.351557 36.216045 A 6.1075649 6.1075649 0 1 0 36.136427,36.216045 A 6.1075649 6.1075649 0 1 0 48.351557 36.216045 z"
transform="matrix(1.099494,0.000000,0.000000,1.099494,44.87933,12.47874)" />
<path
style="fill:url(#linearGradient1531);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 55.758098,43.619804 L 96.835997,31.883262 L 77.135370,47.601846 L 55.758098,43.619804 z "
id="path1530"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1533);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 67.743635,52.574355 C 67.743635,52.574355 76.650495,55.373656 71.306375,56.391583 C 65.962265,57.409511 52.729203,56.137101 48.911975,58.681920 C 45.094747,61.226739 40.768555,69.370159 43.822338,70.897050 C 46.876120,72.423942 55.019540,63.771558 62.145035,62.499148 C 69.270525,61.226739 84.539435,61.990185 85.302885,59.445366 C 86.066325,56.900547 71.481025,49.204343 68.681725,49.204343 C 65.882425,49.204343 67.743635,52.574355 67.743635,52.574355 z "
id="path1532"
sodipodi:nodetypes="cccccccc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<g
id="g1657"
transform="matrix(1.219881,-3.355633e-2,3.355633e-2,1.219881,15.12310,17.23540)"
style="fill:url(#linearGradient1527);">
<path
style="fill-rule:evenodd;stroke-width:0.57499999;"
d="M 24.859391,31.907937 C 23.419824,24.350211 24.964801,11.778293 30.054438,8.9789918 C 35.144076,6.1796912 40.379124,5.3034583 41.760605,9.7424375 C 43.243834,14.508354 39.448349,16.768623 34.704351,20.597833 C 29.745701,24.600304 28.340109,28.103497 24.859391,31.907937 z "
id="path1658"
sodipodi:nodetypes="cczzc" />
</g>
<path
style="fill:url(#linearGradient1734);fill-opacity:0.44654086;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 74.490374,118.99279 C 74.854272,116.80940 78.129348,101.16181 82.132218,98.614531 C 86.135090,96.067249 83.587809,101.16181 85.043399,103.70910 C 86.498988,106.25638 93.776936,96.067249 93.776936,100.43402 C 93.776936,104.80079 87.226783,107.71197 91.593550,106.98417 C 95.960320,106.25638 107.96894,102.61740 101.78268,107.34807 C 95.596422,112.07874 92.321346,118.99279 87.954578,116.80940 C 83.587809,114.62602 82.132218,121.54007 78.493246,121.54007 C 74.854272,121.54007 74.126476,121.54007 74.490374,118.99279 z "
id="path1726" />
<path
style="fill:url(#linearGradient1659);fill-opacity:0.42767295;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 43.559096,98.978428 C 43.559096,98.978428 47.198070,107.71197 50.837044,112.44264 C 54.476018,117.17330 49.745352,123.72345 45.014686,119.35669 C 40.284021,114.98992 25.364228,111.71484 25.728125,107.34807 C 26.092022,102.98130 32.278278,110.98705 33.369970,107.34807 C 34.461662,103.70910 26.092022,95.339454 30.458791,96.431147 C 34.825559,97.522839 38.100636,108.43976 39.192328,102.25351 C 40.284021,96.067249 38.828431,90.608789 43.559096,98.978428 z "
id="path1729" />
<text
xml:space="preserve"
style="font-size:12.000000;stroke-width:1.0000000pt;font-family:helvetica;"
x="0.69148552"
y="182.14601"
id="text1067"><tspan
id="tspan1068">LyX</tspan></text>
<text
xml:space="preserve"
style="font-size:12.000000;stroke-width:1.0000000pt;font-family:helvetica;"
x="62.452923"
y="762.71289"
id="text1070"
transform="scale(0.246729,0.246729)"><tspan
id="tspan1071">Created by Andrew Fitzsimon</tspan><tspan
sodipodi:role="line"
id="tspan1831"
x="62.452923"
y="774.71289">trace of the LyX Logo</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

View File

@ -0,0 +1,761 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg1"
sodipodi:version="0.34"
inkscape:version="0.39cvs"
width="128.00000pt"
height="128.00000pt"
sodipodi:docname="/home/angus/lyx_doc.svg"
sodipodi:docbase="/home/angus">
<defs
id="defs3">
<linearGradient
id="linearGradient1806">
<stop
style="stop-color:#000000;stop-opacity:0.40677965;"
offset="0.0000000"
id="stop1807" />
<stop
style="stop-color:#000000;stop-opacity:0.073446326;"
offset="0.64777780"
id="stop3276" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1808" />
</linearGradient>
<linearGradient
id="linearGradient1518">
<stop
style="stop-color:#ffffff;stop-opacity:0.74226803;"
offset="0.0000000"
id="stop1519" />
<stop
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1520" />
</linearGradient>
<linearGradient
id="linearGradient1512">
<stop
style="stop-color:#000000;stop-opacity:0.54639173;"
offset="0.0000000"
id="stop1513" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop1514" />
</linearGradient>
<pattern
width="130.00000"
height="96.000000"
id="pattern903">
<image
xlink:href="/home/andy/Desktop/lux.png"
sodipodi:absref="/home/andy/Desktop/lux.png"
width="130.00000"
height="96.000000"
id="image904" />
</pattern>
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1515"
x1="0.14117648"
y1="0.17073171"
x2="0.74117649"
y2="0.45121950" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1517"
x1="0.56209153"
y1="-3.2146594e-17"
x2="0.56862748"
y2="0.64843750" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1522"
x1="0.34108528"
y1="1.0468750"
x2="0.33333334"
y2="0.46093750" />
<radialGradient
xlink:href="#linearGradient1518"
id="radialGradient1524" />
<radialGradient
xlink:href="#linearGradient1518"
id="radialGradient1525" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1527"
x1="0.99291223"
y1="0.38505521"
x2="-0.12118133"
y2="0.38729247" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1529"
x1="0.99346405"
y1="1.6406250"
x2="0.71241832"
y2="0.62500000" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1531"
x1="0.92941177"
y1="0.35714287"
x2="0.32629615"
y2="0.35714287" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1533"
x1="0.69879520"
y1="0.61718750"
x2="0.44176707"
y2="0.32812500" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1535"
x1="0.0039215689"
y1="0.94642860"
x2="0.45490196"
y2="0.58928573" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1537"
x1="0.33070865"
y1="1.2265625"
x2="0.43307087"
y2="0.42968750" />
<linearGradient
xlink:href="#linearGradient1512"
id="linearGradient1539"
x1="0.16788322"
y1="1.0312500"
x2="0.63503647"
y2="0.45312500" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1659"
x1="0.40458015"
y1="1.3828125"
x2="0.35877863"
y2="0.54687500" />
<radialGradient
xlink:href="#linearGradient1806"
id="radialGradient1977"
cx="0.50000000"
cy="0.50000000"
r="0.50000000"
fx="0.50000000"
fy="0.50000000" />
<linearGradient
xlink:href="#linearGradient1518"
id="linearGradient1734"
x1="0.67319918"
y1="0.99825197"
x2="0.47887364"
y2="0.30443147"
gradientTransform="scale(0.906215,1.103491)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0000000"
inkscape:pageshadow="2"
inkscape:zoom="1.2279853"
inkscape:cx="57.933129"
inkscape:cy="15.420322"
inkscape:window-width="420"
inkscape:window-height="491"
inkscape:window-x="97"
inkscape:window-y="125" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1977);fill-opacity:0.75000000;fill-rule:evenodd;stroke-width:1.0000000pt;"
id="path1976"
sodipodi:cx="41.875938"
sodipodi:cy="37.865574"
sodipodi:rx="12.562782"
sodipodi:ry="12.562782"
d="M 54.43872 37.86557 A 12.56278 12.56278 0 1 0 29.31316 37.86557 A 12.56278 12.56278 0 1 0 54.43872 37.86557 z"
transform="matrix(6.757552,0.000000,0.000000,3.357903,-212.4401,-10.33593)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1977);fill-opacity:0.75000000;fill-rule:evenodd;stroke-width:1.0000000pt;"
id="path1724"
sodipodi:cx="41.875938"
sodipodi:cy="37.865574"
sodipodi:rx="12.562782"
sodipodi:ry="12.562782"
d="M 54.43872 37.86557 A 12.56278 12.56278 0 1 0 29.31316 37.86557 A 12.56278 12.56278 0 1 0 54.43872 37.86557 z"
transform="matrix(6.757552,0.000000,0.000000,3.357903,-196.6048,-24.73160)" />
<text
xml:space="preserve"
style="font-size:12.000000;stroke-width:1.0000000pt;font-family:helvetica;"
x="0.69148552"
y="182.14601"
id="text1067"><tspan
id="tspan1068">LyX</tspan></text>
<text
xml:space="preserve"
style="font-size:12.000000;stroke-width:1.0000000pt;font-family:helvetica;"
x="62.452923"
y="762.71289"
id="text1070"
transform="scale(0.246729,0.246729)"><tspan
id="tspan1071">Created by Andrew Fitzsimon</tspan><tspan
sodipodi:role="line"
id="tspan1831"
x="62.4529228"
y="774.712891">trace of the LyX Logo</tspan></text>
<g
id="g764"
transform="translate(0,7.086601)">
<g
id="g678"
transform="translate(-3.086827,-7.202625)">
<defs
id="defs679">
<linearGradient
id="linearGradient1507">
<stop
id="stop1508"
offset="0.0000000"
style="stop-color:#000000;stop-opacity:0.095505618;" />
<stop
id="stop1510"
offset="1.0000000"
style="stop-color:#000000;stop-opacity:0.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient852"
xlink:href="#linearGradient1507" />
<linearGradient
id="linearGradient844"
xlink:href="#linearGradient1507" />
<linearGradient
id="linearGradient845"
x1="1.3833333"
x2="0.10833333"
y1="0.49019608"
y2="0.50490195"
xlink:href="#linearGradient841" />
<linearGradient
id="linearGradient840"
x1="-0.22348484"
x2="0.59469700"
y1="0.38235295"
y2="0.46568626"
xlink:href="#linearGradient853" />
<linearGradient
id="linearGradient849"
x1="0.010563380"
x2="1.2288733"
y1="0.43229166"
y2="0.46354166"
xlink:href="#linearGradient846" />
<radialGradient
cx="0.50000000"
cy="0.50000000"
fx="0.50000000"
fy="0.14942528"
id="radialGradient864"
r="0.50000000"
xlink:href="#linearGradient853" />
<linearGradient
id="linearGradient841">
<stop
id="stop842"
offset="0.00000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop843"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.00000000;" />
</linearGradient>
<linearGradient
id="linearGradient1290">
<stop
id="stop1291"
offset="0.0000000"
style="stop-color:#b2a269;stop-opacity:1.0000000;" />
<stop
id="stop1292"
offset="1.0000000"
style="stop-color:#6d5b18;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient860"
x1="0.47535211"
x2="0.50000000"
y1="0.81081080"
y2="-0.74324322"
xlink:href="#linearGradient1290" />
<linearGradient
id="linearGradient851"
x1="0.39788732"
x2="0.80985916"
y1="0.32222223"
y2="0.35555556"
xlink:href="#linearGradient846" />
<linearGradient
id="linearGradient858"
x1="0.64285713"
x2="0.57142860"
y1="1.2647059"
y2="0.049019609"
xlink:href="#linearGradient846" />
<linearGradient
id="linearGradient846">
<stop
id="stop847"
offset="0.00000000"
style="stop-color:#e7e7e7;stop-opacity:1.0000000;" />
<stop
id="stop848"
offset="1.0000000"
style="stop-color:#a5a5a5;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient850"
xlink:href="#linearGradient846" />
<linearGradient
id="linearGradient859"
x1="1.4647887"
x2="0.26408452"
y1="-1.1486486"
y2="1.2905406"
xlink:href="#linearGradient853" />
<linearGradient
id="linearGradient853">
<stop
id="stop854"
offset="0.00000000"
style="stop-color:#000000;stop-opacity:0.29752067;" />
<stop
id="stop855"
offset="1.0000000"
style="stop-color:#000000;stop-opacity:0.00000000;" />
</linearGradient>
<radialGradient
cx="0.50000000"
cy="0.50000000"
fx="0.50704223"
fy="0.29885057"
id="radialGradient861"
r="0.50000000"
xlink:href="#linearGradient853" />
<linearGradient
id="linearGradient1501">
<stop
id="stop1502"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop1504"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient1492">
<stop
id="stop1493"
offset="0.0000000"
style="stop-color:#cbcbcb;stop-opacity:1.0000000;" />
<stop
id="stop1496"
offset="0.34923077"
style="stop-color:#f0f0f0;stop-opacity:1.0000000;" />
<stop
id="stop1494"
offset="1.0000000"
style="stop-color:#e2e2e2;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient1495"
x1="0.92307693"
x2="0.14529915"
y1="0.16406250"
y2="1.1718750"
xlink:href="#linearGradient1492" />
<linearGradient
id="linearGradient1497"
x1="0.63247865"
x2="-0.37606838"
y1="0.32812500"
y2="1.3281250"
xlink:href="#linearGradient1492" />
<linearGradient
id="linearGradient1499"
x1="0.85826772"
x2="0.062992126"
y1="0.14062500"
y2="0.54687500"
xlink:href="#linearGradient1501" />
<linearGradient
id="linearGradient1506"
x1="0.052173913"
x2="0.78260869"
y1="0.97656250"
y2="0.0078125000"
xlink:href="#linearGradient1507" />
<linearGradient
id="linearGradient1556"
x1="0.31111112"
x2="0.62222224"
y1="-0.56250000"
y2="0.79687500"
xlink:href="#linearGradient1507" />
<radialGradient
cx="0.50000000"
cy="0.89285713"
fx="0.54117650"
fy="3.5200000"
id="radialGradient856"
r="0.54606670"
xlink:href="#linearGradient841" />
<linearGradient
id="linearGradient1944"
xlink:href="#linearGradient841" />
</defs>
<sodipodi:namedview
inkscape:cx="28.450752"
inkscape:cy="97.214075"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-height="491"
inkscape:window-width="390"
inkscape:window-x="323"
inkscape:window-y="53"
inkscape:zoom="4.7658944"
bordercolor="#666666"
borderopacity="1.0"
id="namedview721"
pagecolor="#ffffff" />
<path
sodipodi:nodetypes="cccccccccccccccc"
d="M 17.159384,6.3292894 L 17.159384,43.068526 L 17.159384,79.807768 L 17.159384,116.54700 L 17.159384,153.28624 L 50.687024,153.28624 L 84.214664,153.28624 L 117.74230,153.28624 L 151.26994,153.28624 L 151.26994,116.54700 L 151.26994,79.807768 L 151.26994,43.068526 L 117.74230,6.3292894 L 84.214664,6.3292894 L 50.687024,6.3292894 L 17.159384,6.3292894 z "
id="path930"
style="fill:#ffffff;fill-rule:evenodd;stroke-width:0.42649043;stroke-opacity:0.36477986;" />
<g
id="g1552"
style="fill:#000000;fill-opacity:0.069182344;"
transform="matrix(0.304171,0.000000,0.000000,0.297572,-36.70399,-112.4880)">
<path
sodipodi:nodetypes="cccccccccccccccc"
d="M 173.35959,408.81260 L 173.35959,531.07360 L 173.35959,653.33460 L 173.35959,775.59560 L 173.35959,897.85660 L 282.12187,897.85660 L 390.88417,897.85660 L 499.64646,897.85660 L 608.40874,897.85660 L 608.40874,775.59560 L 608.40874,653.33460 L 608.40874,531.07360 L 499.64646,408.81260 L 390.88417,408.81260 L 282.12187,408.81260 L 173.35959,408.81260 z "
id="path1505"
style="fill-opacity:0.069182344;fill-rule:evenodd;stroke-width:0.95407495pt;fill:#000000;" />
<path
d="M 170.12500,407.18750 C 170.12500,571.82292 170.12500,736.45833 170.12500,901.09375 C 317.30208,901.09375 464.47917,901.09375 611.65625,901.09375 C 611.65625,777.33333 611.65625,653.57292 611.65625,529.81250 C 574.80918,488.38978 537.97604,446.95335 501.09375,405.56250 C 390.77083,405.56250 280.44792,405.56250 170.12500,405.56250 C 170.12500,405.89583 170.12500,406.97917 170.12500,407.18750 z "
id="path725"
style="fill-opacity:0.069182344;fill-rule:evenodd;stroke-width:0.95407495pt;fill:#000000;" />
<path
d="M 166.87500,403.93750 C 166.87500,570.73958 166.87500,737.54167 166.87500,904.34375 C 316.21875,904.34375 465.56250,904.34375 614.90625,904.34375 C 614.90625,779.08333 614.90625,653.82292 614.90625,528.56250 C 577.45517,486.47298 540.01754,444.37017 502.53125,402.31250 C 390.64583,402.31250 278.76042,402.31250 166.87500,402.31250 C 166.87500,402.64583 166.87500,403.72917 166.87500,403.93750 z "
id="path1543"
style="fill-opacity:0.069182344;fill-rule:evenodd;stroke-width:0.95407495pt;fill:#000000;" />
</g>
<path
sodipodi:nodetypes="cccccccccccccccc"
d="M 297.99034,136.74154 L 297.99034,260.57234 L 297.99034,384.40315 L 297.99034,508.23395 L 297.99034,632.06475 L 410.99634,632.06475 L 524.00235,632.06475 L 637.00835,632.06475 L 750.01435,632.06475 L 750.01435,508.23395 L 750.01435,384.40315 L 750.01435,260.57234 L 637.00835,136.74154 L 524.00235,136.74154 L 410.99634,136.74154 L 297.99034,136.74154 z "
id="rect900"
style="fill:url(#linearGradient1495);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.4375000;stroke-opacity:0.36477986;"
transform="matrix(0.296689,0.000000,0.000000,0.296689,-71.19601,-34.05825)" />
<path
sodipodi:nodetypes="cccc"
d="M 750.01435,260.57234 C 715.94460,250.48602 671.79788,251.91624 638.44792,257.66516 C 644.20618,220.71628 644.92597,174.41021 637.00835,136.74154 L 750.01435,260.57234 z "
id="path906"
style="fill:url(#linearGradient1497);fill-opacity:1;fill-rule:evenodd;stroke-width:0.95407495pt;"
transform="matrix(0.296689,0.000000,0.000000,0.296689,-71.19601,-34.05825)" />
<path
sodipodi:nodetypes="cccczc"
d="M 301.30655,174.90867 L 299.27069,628.90434 L 743.08709,628.90434 L 743.34157,516.67783 C 733.41677,520.49506 633.15091,378.49417 506.92790,384.60173 C 380.59029,390.71484 413.27857,193.23136 301.30655,174.90867 z "
id="path1500"
style="fill:url(#linearGradient1499);fill-opacity:1;fill-rule:evenodd;stroke-width:1.0000000pt;"
transform="matrix(0.296689,0.000000,0.000000,0.296689,-71.19601,-34.05825)" />
<metadata
id="metadata730">
<rdf:RDF
xmlns:cc="http://web.resource.org/cc/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<cc:Work
rdf:about="">
<dc:title>Etiquette Icons</dc:title>
<dc:description />
<dc:subject>
<rdf:Bag>
<rdf:li>hash</rdf:li>
<rdf:li>icons</rdf:li>
<rdf:li>computer</rdf:li>
<rdf:li />
</rdf:Bag>
</dc:subject>
<dc:publisher>
<cc:Agent
rdf:about="http://www.openclipart.org">
<dc:title>Andy Fitzsimon</dc:title>
</cc:Agent>
</dc:publisher>
<dc:creator>
<cc:Agent
rdf:about="">
<dc:title>Andy Fitzsimon</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent
rdf:about="">
<dc:title>Andy Fitzsimon</dc:title>
</cc:Agent>
</dc:rights>
<dc:date />
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://web.resource.org/cc/PublicDomain">
<dc:date />
</cc:license>
<dc:language>en</dc:language>
</cc:Work>
<cc:License
rdf:about="http://web.resource.org/cc/PublicDomain">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</g>
<g
id="g731"
transform="matrix(0.8,0,0,0.8,16.7711,15.21633)">
<g
id="g1540"
transform="matrix(1.429413,-3.932010e-2,3.932010e-2,1.429413,6.816050,14.52049)"
style="">
<path
style="fill:#212121;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 24.859391,31.907937 C 23.419824,24.350211 24.964801,11.778293 30.054438,8.9789918 C 35.144076,6.1796912 40.379124,5.3034583 41.760605,9.7424375 C 43.243834,14.508354 39.448349,16.768623 34.704351,20.597833 C 29.745701,24.600304 28.340109,28.103497 24.859391,31.907937 z "
id="path917"
sodipodi:nodetypes="cczzc" />
</g>
<path
style="fill:#618bb4;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 25.193706,48.176692 C 25.193706,48.176692 24.939224,26.545733 44.025365,23.491950 C 63.111506,20.438168 70.109757,49.449102 68.710107,54.029776 C 67.310457,58.610450 49.351398,70.044503 37.645232,66.227275 C 25.939066,62.410047 26.975079,57.338040 25.193706,48.176692 z "
id="path918"
sodipodi:nodetypes="cczcc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1529);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.074289,48.939744 C 28.074289,48.939744 27.844841,29.436670 45.053436,26.683294 C 62.262031,23.929920 69.374917,51.234223 67.309886,54.217047 C 65.244854,57.199869 51.477978,62.247724 40.923373,58.806005 C 30.368769,55.364286 29.680425,57.199869 28.074289,48.939744 z "
id="path1528"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1517);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 25.891950,48.915464 C 25.891950,48.915464 25.637468,27.284505 44.723609,24.230722 C 63.809750,21.176940 71.698688,51.460283 69.408351,54.768548 C 67.118014,58.076812 51.849101,63.675413 40.142935,59.858185 C 28.436769,56.040957 27.673323,58.076812 25.891950,48.915464 z "
id="path1516"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#a2360f;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 40.717100,73.115916 C 40.717100,68.916965 50.070907,54.562023 54.040131,54.343356 C 58.099053,54.119748 55.986013,56.829076 59.039796,56.574594 C 62.093578,56.320112 67.183216,56.574594 68.201143,59.882859 C 69.219071,63.191123 69.473553,72.606953 66.165288,73.370398 C 62.857024,74.133844 60.057723,74.897290 58.276350,77.442108 C 56.494977,79.986927 51.150858,84.567601 46.061220,82.277264 C 41.078519,80.035049 40.717100,77.314867 40.717100,73.115916 z "
id="path916"
sodipodi:nodetypes="czcccczz"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#e7d417;fill-opacity:0.44654086;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 47.842593,75.406253 C 48.097075,73.879362 50.387412,62.936641 53.186712,61.155268 C 55.986013,59.373895 54.204640,62.936641 55.222568,64.718014 C 56.240495,66.499388 61.330133,59.373895 61.330133,62.427678 C 61.330133,65.481460 56.749459,67.517315 59.803241,67.008351 C 62.857024,66.499388 71.254926,63.954569 66.928734,67.262833 C 62.602542,70.571098 60.312205,75.406253 57.258423,73.879362 C 54.204640,72.352471 53.186712,77.187626 50.641894,77.187626 C 48.097075,77.187626 47.588111,77.187626 47.842593,75.406253 z "
id="path922"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1537);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 40.983128,72.559266 C 40.983128,68.360315 50.336933,54.005373 54.306163,53.786706 C 58.365083,53.563098 56.252043,56.272426 59.305823,56.017944 C 62.359603,55.763462 67.449243,56.017944 68.467173,59.326209 C 69.485103,62.634473 69.739583,72.050303 66.431313,72.813748 C 63.123053,73.577194 60.323753,74.340640 58.542383,76.885458 C 56.761003,79.430277 51.416883,84.010951 46.327253,81.720614 C 41.344547,79.478399 40.983128,76.758217 40.983128,72.559266 z "
id="path1536"
sodipodi:nodetypes="czcccczz"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1515);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 51.150857,44.868428 L 78.634900,52.757366 L 100.26586,36.979490 L 51.150857,44.868428 z "
id="path910"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#bd3200;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 50.387412,44.359464 L 100.26586,30.108479 L 76.344563,49.194620 L 50.387412,44.359464 z "
id="path909"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:#f4f4f4;fill-rule:evenodd;stroke-width:0.47612661;"
id="path914"
sodipodi:cx="61.584614"
sodipodi:cy="30.108479"
sodipodi:rx="8.9068661"
sodipodi:ry="8.9068661"
d="M 70.49148 30.10848 A 8.906866 8.906866 0 1 0 52.67775 30.10848 A 8.906866 8.906866 0 1 0 70.49148 30.10848 z"
transform="matrix(1.726901,0.000000,0.000000,1.726901,-13.97865,2.029577)" />
<path
style="fill:#a2360f;fill-rule:evenodd;stroke-width:0.57499999;fill-opacity:1.0000000;"
d="M 27.993007,55.556667 C 27.993007,55.556667 27.484043,58.355967 29.774380,60.900786 C 32.064717,63.445605 41.480546,72.097989 38.172282,77.187626 C 34.864017,82.277264 26.211633,82.786228 23.157851,79.223481 C 20.104068,75.660735 8.9068657,71.080061 9.1613476,69.298688 C 9.4158295,67.517315 5.0896376,58.610449 11.960648,58.101486 C 18.831659,57.592522 23.412333,53.011848 25.448188,52.757366 C 27.484043,52.502884 28.247488,53.775294 27.993007,55.556667 z "
id="path915"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#e7d417;fill-opacity:0.42767295;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 26.211633,61.409750 C 26.211633,61.409750 28.756452,67.517315 31.301271,70.825580 C 33.846090,74.133844 30.537825,78.714518 27.229561,75.660735 C 23.921297,72.606953 13.487540,70.316616 13.742021,67.262833 C 13.996503,64.209051 18.322695,69.807652 19.086141,67.262833 C 19.849586,64.718014 13.996503,58.864931 17.050286,59.628377 C 20.104068,60.391823 22.394405,68.026279 23.157851,63.700087 C 23.921297,59.373895 22.903369,55.556667 26.211633,61.409750 z "
id="path921"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1539);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.286502,55.412556 C 28.286502,55.412556 27.777538,58.211856 30.067875,60.756675 C 32.358212,63.301494 41.774041,71.953878 38.465777,77.043515 C 35.157512,82.133153 26.505128,82.642117 23.451346,79.079370 C 20.397563,75.516624 9.2003609,70.935950 9.4548429,69.154577 C 9.7093249,67.373204 5.3831329,58.466338 12.254143,57.957375 C 19.125154,57.448411 23.705828,52.867737 25.741683,52.613255 C 27.777538,52.358773 28.540983,53.631183 28.286502,55.412556 z "
id="path1538"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:#e4d66e;fill-rule:evenodd;stroke-width:0.59175676;"
id="path1510"
sodipodi:cx="61.584614"
sodipodi:cy="30.108479"
sodipodi:rx="8.9068661"
sodipodi:ry="8.9068661"
d="M 70.49148 30.10848 A 8.906866 8.906866 0 1 0 52.67775 30.10848 A 8.906866 8.906866 0 1 0 70.49148 30.10848 z"
transform="matrix(1.389462,0.000000,0.000000,1.389462,7.172151,12.65069)" />
<path
sodipodi:type="arc"
style="fill-rule:evenodd;stroke-width:0.57499999;"
id="path912"
sodipodi:cx="61.584614"
sodipodi:cy="31.126406"
sodipodi:rx="5.8530831"
sodipodi:ry="5.8530831"
d="M 67.4377 31.12641 A 5.853083 5.853083 0 1 0 55.73153 31.12641 A 5.853083 5.853083 0 1 0 67.4377 31.12641 z"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.286480,10.63843)" />
<path
style="fill:#45800c;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 25.957152,48.431174 C 25.957152,48.431174 31.810235,47.922210 29.774380,50.975993 C 27.738525,54.029776 20.867514,55.047703 25.193706,56.320112 C 29.519898,57.592522 52.423267,58.101486 54.968086,59.373895 C 57.512904,60.646304 50.132930,68.535243 45.297774,67.008351 C 40.462619,65.481460 33.591608,59.119413 26.466115,60.137341 C 19.340623,61.155268 12.469612,65.226978 12.215130,60.900786 C 11.960648,56.574594 17.559250,49.703584 25.957152,48.431174 z "
id="path919"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1535);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 28.123743,46.722923 C 28.123743,46.722923 33.733476,46.235120 31.782264,49.161938 C 29.831053,52.088756 23.245714,53.064361 27.392038,54.283868 C 31.538363,55.503375 53.489492,55.991179 55.928506,57.210685 C 58.367520,58.430192 51.294379,65.991137 46.660251,64.527728 C 42.026124,63.064320 35.440785,56.966784 28.611545,57.942390 C 21.782305,58.917995 15.196966,62.820418 14.953065,58.674094 C 14.709163,54.527769 20.074995,47.942431 28.123743,46.722923 z "
id="path1534"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:#52980f;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 68.710107,53.011848 C 68.710107,53.011848 77.616973,55.811149 72.272853,56.829076 C 66.928734,57.847004 53.695676,56.574594 49.878448,59.119413 C 46.061220,61.664232 41.735028,69.807652 44.788811,71.334543 C 47.842593,72.861435 55.986013,64.209051 63.111506,62.936641 C 70.236998,61.664232 85.505911,62.427678 86.269357,59.882859 C 87.032802,57.338040 72.447502,49.641836 69.648201,49.641836 C 66.848901,49.641836 68.710107,53.011848 68.710107,53.011848 z "
id="path920"
sodipodi:nodetypes="cccccccc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient1522);fill-rule:evenodd;stroke-width:0.62365168;"
id="path1523"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.15086 35.4526 A 9.161347 9.161347 0 1 0 32.82816 35.4526 A 9.161347 9.161347 0 1 0 51.15086 35.4526 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,36.93339,7.749206)" />
<path
sodipodi:type="arc"
style="fill:#f4f4f4;fill-rule:evenodd;stroke-width:0.49186331;"
id="path923"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.15086 35.4526 A 9.161347 9.161347 0 1 0 32.82816 35.4526 A 9.161347 9.161347 0 1 0 51.15086 35.4526 z"
transform="matrix(1.671651,0.000000,0.000000,1.671651,-3.918064,5.232760)" />
<path
sodipodi:type="arc"
style="fill:#e4d66e;fill-rule:evenodd;stroke-width:0.62365168;"
id="path913"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.15086 35.4526 A 9.161347 9.161347 0 1 0 32.82816 35.4526 A 9.161347 9.161347 0 1 0 51.15086 35.4526 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,11.09669,17.21056)" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient1522);fill-rule:evenodd;stroke-width:0.62365168;"
id="path1521"
sodipodi:cx="41.989510"
sodipodi:cy="35.452599"
sodipodi:rx="9.1613474"
sodipodi:ry="9.1613474"
d="M 51.15086 35.4526 A 9.161347 9.161347 0 1 0 32.82816 35.4526 A 9.161347 9.161347 0 1 0 51.15086 35.4526 z"
transform="matrix(1.318402,0.000000,0.000000,1.318402,11.09667,16.84664)" />
<path
sodipodi:type="arc"
style="fill-rule:evenodd;stroke-width:0.57499999;"
id="path911"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.35155 36.21605 A 6.107565 6.107565 0 1 0 36.13643 36.21605 A 6.107565 6.107565 0 1 0 48.35155 36.21605 z"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.971427,11.22306)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1524);fill-rule:evenodd;stroke-width:1.1081090;"
id="path1509"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.35155 36.21605 A 6.107565 6.107565 0 1 0 36.13643 36.21605 A 6.107565 6.107565 0 1 0 48.35155 36.21605 z"
transform="matrix(1.099494,0.000000,0.000000,1.099494,18.05623,20.13574)" />
<path
sodipodi:type="arc"
style="fill:url(#radialGradient1525);fill-rule:evenodd;stroke-width:1.1081090;"
id="path1511"
sodipodi:cx="42.243992"
sodipodi:cy="36.216045"
sodipodi:rx="6.1075649"
sodipodi:ry="6.1075649"
d="M 48.35155 36.21605 A 6.107565 6.107565 0 1 0 36.13643 36.21605 A 6.107565 6.107565 0 1 0 48.35155 36.21605 z"
transform="matrix(1.099494,0.000000,0.000000,1.099494,44.87933,12.47874)" />
<path
style="fill:url(#linearGradient1531);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 55.758098,43.619804 L 96.835997,31.883262 L 77.135370,47.601846 L 55.758098,43.619804 z "
id="path1530"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<path
style="fill:url(#linearGradient1533);fill-rule:evenodd;stroke-width:0.57499999;"
d="M 67.743635,52.574355 C 67.743635,52.574355 76.650495,55.373656 71.306375,56.391583 C 65.962265,57.409511 52.729203,56.137101 48.911975,58.681920 C 45.094747,61.226739 40.768555,69.370159 43.822338,70.897050 C 46.876120,72.423942 55.019540,63.771558 62.145035,62.499148 C 69.270525,61.226739 84.539435,61.990185 85.302885,59.445366 C 86.066325,56.900547 71.481025,49.204343 68.681725,49.204343 C 65.882425,49.204343 67.743635,52.574355 67.743635,52.574355 z "
id="path1532"
sodipodi:nodetypes="cccccccc"
transform="matrix(1.429954,0.000000,0.000000,1.429954,6.412650,11.07234)" />
<g
id="g1657"
transform="matrix(1.219881,-3.355633e-2,3.355633e-2,1.219881,15.12310,17.23540)"
style="fill:url(#linearGradient1527);">
<path
style="fill-rule:evenodd;stroke-width:0.57499999;"
d="M 24.859391,31.907937 C 23.419824,24.350211 24.964801,11.778293 30.054438,8.9789918 C 35.144076,6.1796912 40.379124,5.3034583 41.760605,9.7424375 C 43.243834,14.508354 39.448349,16.768623 34.704351,20.597833 C 29.745701,24.600304 28.340109,28.103497 24.859391,31.907937 z "
id="path1658"
sodipodi:nodetypes="cczzc" />
</g>
<path
style="fill:url(#linearGradient1734);fill-opacity:0.44654086;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 74.490374,118.99279 C 74.854272,116.80940 78.129348,101.16181 82.132218,98.614531 C 86.135090,96.067249 83.587809,101.16181 85.043399,103.70910 C 86.498988,106.25638 93.776936,96.067249 93.776936,100.43402 C 93.776936,104.80079 87.226783,107.71197 91.593550,106.98417 C 95.960320,106.25638 107.96894,102.61740 101.78268,107.34807 C 95.596422,112.07874 92.321346,118.99279 87.954578,116.80940 C 83.587809,114.62602 82.132218,121.54007 78.493246,121.54007 C 74.854272,121.54007 74.126476,121.54007 74.490374,118.99279 z "
id="path1726" />
<path
style="fill:url(#linearGradient1659);fill-opacity:0.42767295;fill-rule:evenodd;stroke-width:0.57499999;"
d="M 43.559096,98.978428 C 43.559096,98.978428 47.198070,107.71197 50.837044,112.44264 C 54.476018,117.17330 49.745352,123.72345 45.014686,119.35669 C 40.284021,114.98992 25.364228,111.71484 25.728125,107.34807 C 26.092022,102.98130 32.278278,110.98705 33.369970,107.34807 C 34.461662,103.70910 26.092022,95.339454 30.458791,96.431147 C 34.825559,97.522839 38.100636,108.43976 39.192328,102.25351 C 40.284021,96.067249 38.828431,90.608789 43.559096,98.978428 z "
id="path1729" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

View File

@ -0,0 +1,109 @@
;Title AbiWord for Windows, NSIS v2 series installer script
;FileDesc Utility functions to set and save/restore file extension to application associations
!ifndef _ABI_UTIL_FILEASSOC_NSH_
!define _ABI_UTIL_FILEASSOC_NSH_
!ifdef HAVE_SYSTEM_PLUGIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; RefreshShellIcons based on
;; http://nsis.sourceforge.net/archive/nsisweb.php?page=236&instances=0
;; by jerome tremblay - april 2003
!define SHCNE_ASSOCCHANGED 0x08000000
!define SHCNF_IDLIST 0
Function RefreshShellIcons
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
(${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
FunctionEnd
!define RefreshShellIcons "call RefreshShellIcons"
!else
!define RefreshShellIcons
!endif ; HAVE_SYSTEM_PLUGIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; parts from http://nsis.sourceforge.net/archive/viewpage.php?pageid=282 by Vytautas
;; Will add the registry entries to associate the given file extension with the
;; previously set (see CreateApplicationAssociation) appType. I.e. indicate to
;; open documents with this extension using the application specified by appType
;; registry entry. If the extension is currently associated with a different
;; appType, it will store the current association in the "prior_appType" key.
!macro CreateFileAssociation extension appType contentType
!define skipBackupLbl "skipBackup_${__LINE__}"
push $0
; back up old value of extension (.ext) if it exists
ReadRegStr $0 HKCR "${extension}" "" ; read current value
StrCmp $0 "" "${skipBackupLbl}" ; nothing, then skip storing old value
StrCmp $0 "${appType}" "${skipBackupLbl}" ; only store if old is different than current
WriteRegStr HKCR "${extension}" "prior_value" "$0" ; actually store the old association
"${skipBackupLbl}:"
; Write File Associations
WriteRegStr HKCR "${extension}" "" "${appType}"
WriteRegStr HKCR "${extension}" "Content Type" "${contentType}"
; Force shell refresh (so icons updated as needed)
${RefreshShellIcons}
pop $0
!undef skipBackupLbl
!macroend
!define CreateFileAssociation "!insertmacro CreateFileAssociation"
!macro CreateApplicationAssociation appType appName appDesc defIcon exeCmd
WriteRegStr HKCR "${appType}" "" "${appDesc}"
WriteRegStr HKCR "${appType}\shell" "" "open"
WriteRegStr HKCR "${appType}\DefaultIcon" "" "${defIcon}"
; Basic command to open the file (pass filename as argv[1] to program executable)
WriteRegStr HKCR "${appType}\shell\open\command" "" '"${exeCmd}" "%1"'
; To open file via DDE (OLE, ie via already active instance) instead of in a new process
; Here for those who want to locally enable, not normally used as having each document
; open in a new process while more resource intensive means a crash with one document
; won't cause loss of work with other open documents.
; WriteRegStr HKCR "${appType}\shell\open\command" "" "${exeCmd}"
; WriteRegStr HKCR "${appType}\shell\open\ddeexec" "" '[Open("%1")]'
; WriteRegStr HKCR "${appType}\shell\open\ddeexec\application" "" "${appName}"
; WriteRegStr HKCR "${appType}\shell\open\ddeexec\topic" "" "System"
; If editing file is a different action than simply opening file
; WriteRegStr HKCR "${appType}\shell\edit" "" "Edit Options File"
; WriteRegStr HKCR "${appType}\shell\edit\command" "" '"${exeCmd}" "%1"'
!macroend
!define CreateApplicationAssociation "!insertmacro CreateApplicationAssociation"
; check if a file extension is associated with us and if so delete it
!macro RemoveFileAssociation extension appType
push $0
push $1
ReadRegStr $0 HKCR "${extension}" ""
StrCmp "$0" "${appType}" 0 Skip_Del_File_Assoc.${extension}
ReadRegStr $0 HKCR "${extension}" "prior_value"
StrCmp "$0" "" "DeleteFA.${extension}" 0 ; if "prior_value" is not empty
ReadRegStr $1 HKCR "$0" "" ; restore previous association
StrCmp "$1" "" DeleteFA.${extension} ; only if it is still valid (has something defined)
WriteRegStr HKCR "${extension}" "" $0 ; actually restore prior association
DeleteRegValue HKCR "${extension}" "prior_value" ; and remove stored value
Goto Skip_Del_File_Assoc.${extension}
DeleteFA.${extension}: ; else delete file association key
DeleteRegKey HKCR "${extension}" ; actually remove file assoications
Skip_Del_File_Assoc.${extension}:
pop $1
pop $0
!macroend
!define RemoveFileAssociation "!insertmacro RemoveFileAssociation"
!endif ; _ABI_UTIL_FILEASSOC_NSH_

View File

@ -0,0 +1,419 @@
; File download.nsh
; This file is part of LyX, the document processor.
; http://www.lyx.org/
; Licence details can be found in the file COPYING or copy at
; http://www.lyx.org/about/license.php3
; Author Angus Leeming
; Full author contact details are available in file CREDITS or copy at
; http://www.lyx.org/about/credits.php
!ifndef _DOWNLOAD_NSH_
!define _DOWNLOAD_NSH_
!include "lyxfunc.nsh"
!include "LogicLib.nsh"
!insertmacro LYX_DEFFUNC `ReadDownloadValues`
!insertmacro LYX_DEFFUNC `EnableBrowseControls`
!insertmacro LYX_DEFFUNC `DownloadEnter`
!insertmacro LYX_DEFFUNC `DownloadLeave`
!macro LYX_FUNCTION_ReadDownloadValues
!insertmacro LYX_FUNC `ReadDownloadValues`
; The stack contains:
; TOP
; FolderPath
; SelectFolder
; Download
; DoNothing
; After this point:
; $0 = FolderPath
; $1 = SelectFolder
; $2 = Download
; $3 = DoNothing
; $4 = temp
Exch $0
Exch
Exch $1
Exch 2
Exch $2
Exch 3
Exch $3
; Populate the registers with the values in the widgets.
; DoNothing.
; If the widget is disabled then set DoNothing ($3) to 0.
; Otherwise, set it equal to the "state" variable of the field.
!insertmacro MUI_INSTALLOPTIONS_READ $3 "ioDownload.ini" "Field 2" "Flags"
IntOp $3 $3 & DISABLED
${if} $3 == 1
StrCpy $3 0
${else}
!insertmacro MUI_INSTALLOPTIONS_READ $3 "ioDownload.ini" "Field 2" "State"
${endif}
; Download
!insertmacro MUI_INSTALLOPTIONS_READ $2 "ioDownload.ini" "Field 3" "State"
; SelectFolder
!insertmacro MUI_INSTALLOPTIONS_READ $1 "ioDownload.ini" "Field 4" "State"
; FolderPath
!insertmacro MUI_INSTALLOPTIONS_READ $0 "ioDownload.ini" "Field 5" "State"
; Return output to user.
; The stack available to the user contains:
; TOP
; Modified FolderPath
; Modified SelectFolder
; Modified Download
; Modified DoNothing
; $0 = FolderPath
; $1 = SelectFolder
; $2 = Download
; $3 = DoNothing
Exch $3
Exch 3
Exch $2
Exch 2
Exch $1
Exch
Exch $0
FunctionEnd
!macroend
!macro LYX_FUNCTION_EnableBrowseControls
!insertmacro LYX_FUNC `EnableBrowseControls`
; After this point:
; $0 = SelectFolder
; $1 = temp
; $2 = temp
; $3 = temp
Push $0
Push $1
Push $2
Push $3
; Populate the registers with the values in the widgets.
; We're interested only in $0 (SelectFolder) here.
${ReadDownloadValues} $1 $2 $0 $3
; Get the dialog HWND, storing it in $1
FindWindow $1 "#32770" "" $HWNDPARENT
; To get the HWND of the controls use:
; GetDlgItem (output var)
; (hwnd of the custom dialog) (1200 + Field number - 1)
; Get the Browse textbox ID
GetDlgItem $2 $1 1204
; Enable it if the SelectFolder ($0) checkbox is selected.
EnableWindow $2 $0
; get Browse button ID
GetDlgItem $2 $1 1205
; Enable it if the Folder checkbox is selected.
EnableWindow $2 $0
; Remove temporaries from stack.
Pop $3
Pop $2
Pop $1
Pop $0
FunctionEnd
!macroend
!macro DownloadEnter_Private ExePath RegistryKey RegistrySubKey RemoveFromPath AddtoPath Required DownloadLabel HomeLabel PageHeader PageDescription
!define skipBackupLbl "skipBackup_${__LINE__}"
StrCpy ${ExePath} ""
ReadRegStr ${ExePath} HKLM "${RegistryKey}" "${RegistrySubKey}"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 1" "Text" ""
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 2" "Text" "$(DownloadPageField2)"
Push $0
${if} ${Required} == 1
StrCpy $0 "NOTIFY"
${else}
StrCpy $0 "DISABLED"
${endif}
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 2" "Flags" $0
Pop $0
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 2" "State" "0"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 3" "Text" "${DownloadLabel}"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 4" "Text" "${HomeLabel}"
${if} ${ExePath} == ""
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 3" "State" "1"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 4" "State" "0"
!insertmacro MUI_INSTALLOPTIONS_READ $0 "ioDownload.ini" "Field 5" "Flags"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 5" "Flags" $0|DISABLED
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 5" "State" ""
${else}
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 3" "State" "0"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 4" "State" "1"
${StrRep} "${ExePath}" "${ExePath}" "${RemoveFromPath}" ""
StrCpy ${ExePath} "${ExePath}${AddtoPath}"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioDownload.ini" "Field 5" "State" "${ExePath}"
${endif}
ClearErrors
!insertmacro MUI_HEADER_TEXT "${PageHeader}" "${PageDescription}"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "ioDownload.ini"
!undef skipBackupLbl
!macroend
!macro LYX_FUNCTION_DownloadEnter
!insertmacro LYX_FUNC `DownloadEnter`
; The stack contains:
; TOP
; ExePath
; RegistryKey
; RegistrySubKey
; RemoveFromPath
; AddtoPath
; Required
; DownloadLabel
; HomeLabel
; PageHeader
; PageDescription
; After this point:
; $0 = ExePath
; $1 = RegistryKey
; $2 = RegistrySubKey
; $3 = RemoveFromPath
; $4 = AddtoPath
; $5 = Required
; $6 = DownloadLabel
; $7 = HomeLabel
; $8 = PageHeader
; $9 = PageDescription
Exch $0
Exch
Exch $1
Exch 2
Exch $2
Exch 3
Exch $3
Exch 4
Exch $4
Exch 5
Exch $5
Exch 6
Exch $6
Exch 7
Exch $7
Exch 8
Exch $8
Exch 9
Exch $9
; Use a macro simply to make life understandable.
!insertmacro DownloadEnter_Private "$0" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
; Return output to user.
Exch $9
Exch 9
Exch $8
Exch 8
Exch $7
Exch 7
Exch $6
Exch 6
Exch $5
Exch 5
Exch $4
Exch 4
Exch $3
Exch 3
Exch $2
Exch 2
Exch $1
Exch
Exch $0
FunctionEnd
!macroend
!macro DownloadLeave_Private DoNotRequire Download FolderPath URL EnterFolder ExeName InvalidFolder
!define skipBackupLbl "skipBackup_${__LINE__}"
!insertmacro MUI_INSTALLOPTIONS_READ $0 "ioDownload.ini" "Settings" "State"
StrCmp $0 0 go_on ; Next button?
${EnableBrowseControls}
Abort ; Return to the page
go_on:
${ReadDownloadValues} ${DoNotRequire} ${Download} $0 ${FolderPath}
${if} ${DoNotRequire} == 1
;
${elseif} ${Download} == 1
StrCpy ${FolderPath} ""
ExecShell open "${URL}"
${else}
${StrTrim} ${FolderPath}
${if} ${FolderPath} == ""
MessageBox MB_OK "${EnterFolder}"
Abort
${endif}
${if} ${FileExists} "${FolderPath}"
${StrRep} ${FolderPath} ${FolderPath} "${ExeName}" ""
${if} ${FileExists} "${FolderPath}${ExeName}"
${else}
MessageBox MB_OK "${InvalidFolder}"
Abort
${endif}
${else}
MessageBox MB_OK "${InvalidFolder}"
Abort
${endif}
${endif}
!undef skipBackupLbl
!macroend
!macro LYX_FUNCTION_DownloadLeave
!insertmacro LYX_FUNC `DownloadLeave`
; The stack contains:
; TOP
; DoNotRequire
; Download
; FolderPath
; URL
; EnterFolder
; ExeName
; InvalidFolder
; After this point:
; $0 = DoNotRequire
; $1 = Download
; $2 = FolderPath
; $3 = URL
; $4 = EnterFolder
; $5 = ExeName
; $6 = InvalidFolder
Exch $0
Exch
Exch $1
Exch 2
Exch $2
Exch 3
Exch $3
Exch 4
Exch $4
Exch 5
Exch $5
Exch 6
Exch $6
; Use a macro simply to make life understandable.
!insertmacro DownloadLeave_Private "$0" "$1" "$2" "$3" "$4" "$5" "$6"
; Return output to user.
Exch $6
Exch 6
Exch $5
Exch 5
Exch $4
Exch 4
Exch $3
Exch 3
Exch $2
Exch 2
Exch $1
Exch
Exch $0
FunctionEnd
!macroend
!macro LYX_FUNCTION_ReadDownloadValues_Call DoNothing Download SelectFolder FolderPath
Push `${DoNothing}`
Push `${Download}`
Push `${SelectFolder}`
Push `${FolderPath}`
Call ReadDownloadValues
Pop `${FolderPath}`
Pop `${SelectFolder}`
Pop `${Download}`
Pop `${DoNothing}`
!macroend
!macro LYX_FUNCTION_EnableBrowseControls_Call
Call EnableBrowseControls
!macroend
!macro LYX_FUNCTION_DownloadEnter_Call ExePath RegistryKey RegistrySubKey RemoveFromPath AddtoPath Required DownloadLabel HomeLabel PageHeader PageDescription
Push `${PageDescription}`
Push `${PageHeader}`
Push `${HomeLabel}`
Push `${DownloadLabel}`
Push `${Required}`
Push `${AddtoPath}`
Push `${RemoveFromPath}`
Push `${RegistrySubKey}`
Push `${RegistryKey}`
Push `${ExePath}`
Call DownloadEnter
; Empty the stack of all the stuff we've just added.
; We're not interested in keeping it, so just fill $0 repeatedly.
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
!macroend
!macro LYX_FUNCTION_DownloadLeave_Call DoNotRequire Download FolderPath URL EnterFolder ExeName InvalidFolder
Push `${InvalidFolder}`
Push `${ExeName}`
Push `${EnterFolder}`
Push `${URL}`
Push `${FolderPath}`
Push `${Download}`
Push `${DoNotRequire}`
Call DownloadLeave
; Empty the stack of all the stuff we've just added.
Pop `${DoNotRequire}`
Pop `${Download}`
Pop `${FolderPath}`
Pop `$0`
Pop `$0`
Pop `$0`
Pop `$0`
!macroend
!endif ; _DOWNLOAD_NSH_

View File

@ -0,0 +1,42 @@
[Settings]
NumFields=5
[Field 1]
Type=Label
Left=5
Right=-1
Top=0
Bottom=10
[Field 2]
Type=RadioButton
Left=0
Right=-1
Top=11
Bottom=22
State=0
Flags=NOTIFY
[Field 3]
Type=RadioButton
Left=0
Right=-1
Top=23
Bottom=34
Flags=NOTIFY
[Field 4]
Type=RadioButton
Left=0
Right=-1
Top=35
Bottom=46
Flags=NOTIFY
[Field 5]
Type=DirRequest
Left=5
Right=-1
Top=47
Bottom=58
Flags=PATH_MUST_EXIST

View File

@ -0,0 +1,16 @@
[Settings]
NumFields=2
[Field 1]
Type=Label
Left=5
Right=-1
Top=0
Bottom=10
[Field 2]
Type=Label
Left=5
Right=-1
Top=11
Bottom=50

View File

@ -0,0 +1,75 @@
; Author: Lilla (lilla@earthlink.net) 2003-06-13
; function IsUserAdmin uses plugin \NSIS\PlusgIns\UserInfo.dll
; This function is based upon code in \NSIS\Contrib\UserInfo\UserInfo.nsi
; This function was tested under NSIS 2 beta 4 (latest CVS as of this writing).
;
; Usage:
; Call IsUserAdmin
; Pop $R0 ; at this point $R0 is "true" or "false"
;
; Modified May 2005 by Angus Leeming, placing the original function
; body inside a macro and defining functions IsUserAdmin and un.IsUserAdmin
; in terms of this macro.
; Allows the function us.IsUserAdmin to be used inside the installer.
!ifndef _IS_USER_ADMIN_NSH_
!define _IS_USER_ADMIN_NSH_
!macro IsUserAdmin_private
!define skipBackupLbl "skipBackup_${__LINE__}"
Push $R0
Push $R1
Push $R2
ClearErrors
UserInfo::GetName
IfErrors Win9x
Pop $R1
UserInfo::GetAccountType
Pop $R2
StrCmp $R2 "Admin" 0 Continue
; Observation: I get here when running Win98SE. (Lilla)
; The functions UserInfo.dll looks for are there on Win98 too,
; but just don't work. So UserInfo.dll, knowing that admin isn't required
; on Win98, returns admin anyway. (per kichik)
; MessageBox MB_OK 'User "$R1" is in the Administrators group'
StrCpy $R0 "true"
Goto Done
Continue:
; You should still check for an empty string because the functions
; UserInfo.dll looks for may not be present on Windows 95. (per kichik)
StrCmp $R2 "" Win9x
StrCpy $R0 "false"
;MessageBox MB_OK 'User "$R1" is in the "$R2" group'
Goto Done
Win9x:
; comment/message below is by UserInfo.nsi author:
; This one means you don't need to care about admin or
; not admin because Windows 9x doesn't either
;MessageBox MB_OK "Error! This DLL can't run under Windows 9x!"
StrCpy $R0 "true"
Done:
;MessageBox MB_OK 'User= "$R1" AccountType= "$R2" IsUserAdmin= "$R0"'
Pop $R2
Pop $R1
Exch $R0
!undef skipBackupLbl
!macroend
Function IsUserAdmin
!insertmacro IsUserAdmin_private
FunctionEnd
Function un.IsUserAdmin
!insertmacro IsUserAdmin_private
FunctionEnd
!endif ; _IS_USER_ADMIN_NSH_

View File

@ -0,0 +1,578 @@
; Lyx for Windows, NSIS v2 series installer script
; File lyx_installer.nsi
; This file is part of LyX, the document processor.
; http://www.lyx.org/
; Licence details can be found in the file COPYING or copy at
; http://www.lyx.org/about/license.php3
; Author Angus Leeming
; Full author contact details are available in file CREDITS or copy at
; http://www.lyx.org/about/credits.php
; This script requires NSIS 2.06 and above
; http://nsis.sourceforge.net/
;--------------------------------
; Do a Cyclic Redundancy Check to make sure the installer
; was not corrupted by the download.
CRCCheck force
; Make the installer as small as possible.
SetCompressor lzma
;--------------------------------
; You should need to change only these macros...
!define PRODUCT_NAME "LyX"
!define PRODUCT_VERSION "1.3.6"
!define PRODUCT_LICENSE_FILE "..\..\..\..\COPYING"
!define PRODUCT_SOURCEDIR "J:\Programs\LyX"
!define PRODUCT_EXE "$INSTDIR\bin\lyx.exe"
!define PRODUCT_EXT ".lyx"
!define PRODUCT_MIME_TYPE "application/lyx"
!define PRODUCT_UNINSTALL_EXE "$INSTDIR\uninstall.exe"
!define INSTALLER_EXE "lyx_setup_136.exe"
!define INSTALLER_ICON "..\icons\lyx_32x32.ico"
; Replaced by HKLM or HKCU depending on SetShellVarContext.
!define PRODUCT_ROOT_KEY "SHCTX"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\lyx.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
;--------------------------------
; Make some of the information above available to NSIS.
Name "${PRODUCT_NAME}"
OutFile "${INSTALLER_EXE}"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
;--------------------------------
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "StrFunc.nsh"
!include "strtrim.nsh"
!include "download.nsh"
; Declare used functions
${StrLoc}
${StrRep}
${StrTrim}
${ReadDownloadValues}
${EnableBrowseControls}
${DownloadEnter}
${DownloadLeave}
; Grabbed from
; http://nsis.sourceforge.net/archive/viewpage.php?pageid=275
!include "is_user_admin.nsh"
; Grabbed from
; http://abiword.pchasm.org/source/cvs/abiword-cvs/abi/src/pkg/win/setup/NSISv2/abi_util_fileassoc.nsh
; Use the Abiword macros to help set up associations with the file extension.
; in the Registry.
!include "abi_util_fileassoc.nsh"
;--------------------------------
; Variables
Var MinSYSPath
Var DownloadMinSYS
Var PythonPath
Var DownloadPython
Var DoNotRequireMiKTeX
Var MiKTeXPath
Var DownloadMiKTeX
Var DoNotRequirePerl
Var PerlPath
Var DownloadPerl
Var DoNotRequireImageMagick
Var ImageMagickPath
Var DownloadImageMagick
Var DoNotRequireGhostscript
Var GhostscriptPath
Var DownloadGhostscript
Var DoNotInstallLyX
Var PathPrefix
Var CreateFileAssociations
Var CreateDesktopIcon
Var StartmenuFolder
Var ProductRootKey
;--------------------------------
; Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
!define MUI_ABORTWARNING
!define MUI_ICON "${INSTALLER_ICON}"
!define MUI_UNICON "${INSTALLER_ICON}"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
Page custom DownloadMinSYS DownloadMinSYS_LeaveFunction
Page custom DownloadPython DownloadPython_LeaveFunction
Page custom DownloadMiKTeX DownloadMiKTeX_LeaveFunction
Page custom DownloadPerl DownloadPerl_LeaveFunction
Page custom DownloadImageMagick DownloadImageMagick_LeaveFunction
Page custom DownloadGhostscript DownloadGhostscript_LeaveFunction
Page custom SummariseDownloads SummariseDownloads_LeaveFunction
; Show the license.
!insertmacro MUI_PAGE_LICENSE "${PRODUCT_LICENSE_FILE}"
; Specify the installation directory.
!insertmacro MUI_PAGE_DIRECTORY
; Define which components to install.
!insertmacro MUI_PAGE_COMPONENTS
; Specify where to install program shortcuts.
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU ${PRODUCT_NAME} $StartmenuFolder
; Watch the components being installed.
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_TEXT "$(FinishPageMessage)"
!define MUI_FINISHPAGE_RUN_TEXT "$(FinishPageRun)"
!define MUI_FINISHPAGE_RUN "${PRODUCT_EXE}"
!insertmacro MUI_PAGE_FINISH
; The uninstaller.
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
; Languages
!insertmacro MUI_LANGUAGE "English" # first language is the default language
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"
!include "lyx_languages\english.nsh"
!include "lyx_languages\french.nsh"
!include "lyx_languages\german.nsh"
LicenseData "$(LyXLicenseData)"
;--------------------------------
; Reserve Files
; These files should be inserted before other files in the data block
; Keep these lines before any File command
; Only for solid compression (by default, solid compression
; is enabled for BZIP2 and LZMA)
ReserveFile "ioDownload.ini"
ReserveFile "ioSummary.ini"
!insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
Section "!${PRODUCT_NAME}" SecCore
SectionIn RO
SectionEnd
Section /o "$(SecAllUsersTitle)" SecAllUsers
SetShellVarContext all
StrCpy $ProductRootKey "HKLM"
SectionEnd
Section "$(SecFileAssocTitle)" SecFileAssoc
StrCpy $CreateFileAssociations "true"
SectionEnd
Section "$(SecDesktopTitle)" SecDesktop
StrCpy $CreateDesktopIcon "true"
SectionEnd
; The '-' makes the section invisible.
; Sections are entered in order, so the settings above are all
; available to SecInstallation
Section "-Installation actions" SecInstallation
SetOverwrite off
SetOutPath "$INSTDIR"
File /r "${PRODUCT_SOURCEDIR}\Resources"
File /r "${PRODUCT_SOURCEDIR}\bin"
${if} "$PathPrefix" != ""
lyx_path_prefix::set "$INSTDIR\Resources\lyx\configure" "$PathPrefix"
Pop $0
${if} $0 != 0
MessageBox MB_OK "$(ModifyingConfigureFailed)"
${endif}
${endif}
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "${PRODUCT_EXE}"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "RootKey" "$ProductRootKey"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "${PRODUCT_UNINSTALL_EXE}"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "${PRODUCT_EXE}"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "StartMenu" "$SMPROGRAMS\$StartmenuFolder"
CreateDirectory "$SMPROGRAMS\$StartmenuFolder"
CreateShortCut "$SMPROGRAMS\$StartmenuFolder\${PRODUCT_NAME}.lnk" "${PRODUCT_EXE}"
CreateShortCut "$SMPROGRAMS\$StartmenuFolder\Uninstall.lnk" "${PRODUCT_UNINSTALL_EXE}"
${if} $CreateDesktopIcon == "true"
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "${PRODUCT_EXE}"
${endif}
${if} $CreateFileAssociations == "true"
${CreateApplicationAssociation} \
"${PRODUCT_NAME}" \
"${PRODUCT_NAME}" \
"${PRODUCT_NAME} Document" \
"${PRODUCT_EXE},1" \
"${PRODUCT_EXE}"
${CreateFileAssociation} "${PRODUCT_EXT}" "${PRODUCT_NAME}" "${PRODUCT_MIME_TYPE}"
${endif}
WriteUninstaller "${PRODUCT_UNINSTALL_EXE}"
SectionEnd
; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecCore} "$(SecCoreDescription)"
!insertmacro MUI_DESCRIPTION_TEXT ${SecAllUsers} "$(SecAllUsersDescription)"
!insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssoc} "$(SecFileAssocDescription)"
!insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} "$(SecDesktopDescription)"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;--------------------------------
; This hook function is called internally by NSIS on installer startup
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ioDownload.ini"
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ioSummary.ini"
; Default settings
; These can be reset to "all" in section SecAllUsers.
SetShellVarContext current
StrCpy $ProductRootKey "HKCU"
; This can be reset to "true" in section SecDesktop.
StrCpy $CreateDesktopIcon "false"
StrCpy $CreateFileAssociations "false"
; If the user does *not* have administrator privileges,
; then make section SecAllUsers readonly.
Call IsUserAdmin
Pop $0
${if} $0 == "true"
!define ENABLE 0x00000001
SectionGetFlags ${SecAllUsers} $0
IntOp $0 $0 | ${ENABLE}
SectionSetFlags ${SecAllUsers} $0
!undef ENABLE
${else}
!define READ_ONLY 0x00000010
SectionGetFlags ${SecAllUsers} $0
IntOp $0 $0 | ${READ_ONLY}
SectionSetFlags ${SecAllUsers} $0
!undef READ_ONLY
${endif}
ClearErrors
FunctionEnd
;--------------------------------
Function DownloadMinSYS
; Search the registry for the MinSYS uninstaller.
; If successful, put its location in $2.
StrCpy $3 "Software\Microsoft\Windows\CurrentVersion\Uninstall"
StrCpy $2 ""
StrCpy $0 0
loop:
EnumRegKey $1 HKLM "$3" $0
${if} $1 == ""
Goto done
${endif}
${StrLoc} $2 "$1" "MSYS-1.0" "<"
${if} $2 > 0
StrCpy $2 "$3\$1"
Goto done
${else}
StrCpy $2 ""
${endif}
IntOp $0 $0 + 1
Goto loop
done:
${DownloadEnter} \
$MinSYSPath "$2" "Inno Setup: App Path" \
"" "\bin" \
0 \
"$(MinSYSDownloadLabel)" \
"$(MinSYSFolderLabel)" \
"$(MinSYSHeader)" \
"$(MinSYSDescription)"
FunctionEnd
Function DownloadMinSYS_LeaveFunction
${DownloadLeave} \
$0 \
$DownloadMinSYS \
$MinSYSPath \
"http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=82721&release_id=158803" \
"$(EnterMinSYSFolder)" \
"\sh.exe" \
"$(InvalidMinSYSFolder)"
FunctionEnd
;--------------------------------
Function DownloadPython
${DownloadEnter} \
$PythonPath "Software\Microsoft\Windows\CurrentVersion\App Paths\Python.exe" "" \
"\Python.exe" "" \
0 \
"$(PythonDownloadLabel)" \
"$(PythonFolderLabel)" \
"$(PythonHeader)" \
"$(PythonDescription)"
FunctionEnd
Function DownloadPython_LeaveFunction
${DownloadLeave} \
$0 \
$DownloadPython \
$PythonPath \
"http://www.python.org/download/" \
"$(EnterPythonFolder)" \
"\Python.exe" \
"$(InvalidPythonFolder)"
FunctionEnd
;--------------------------------
Function DownloadMiKTeX
${DownloadEnter} \
$MiKTeXPath "Software\MiK\MiKTeX\CurrentVersion\MiKTeX" "Install Root" \
"" "\miktex\bin" \
1 \
"$(MiKTeXDownloadLabel)" \
"$(MiKTeXFolderLabel)" \
"$(MiKTeXHeader)" \
"$(MiKTeXDescription)"
FunctionEnd
Function DownloadMiKTeX_LeaveFunction
${DownloadLeave} \
$DoNotRequireMiKTeX \
$DownloadMiKTeX \
$MiKTeXPath \
"http://www.miktex.org/setup.html" \
"$(EnterMiKTeXFolder)" \
"\latex.exe" \
"$(InvalidMiKTeXFolder)"
FunctionEnd
;--------------------------------
Function DownloadPerl
${DownloadEnter} \
$PerlPath "Software\Perl" BinDir \
"\perl.exe" "" \
1 \
"$(PerlDownloadLabel)" \
"$(PerlFolderLabel)" \
"$(PerlHeader)" \
"$(PerlDescription)"
FunctionEnd
Function DownloadPerl_LeaveFunction
${DownloadLeave} \
$DoNotRequirePerl \
$DownloadPerl \
$PerlPath \
"http://www.activestate.com/Products/ActivePerl/" \
"$(EnterPerlFolder)" \
"\perl.exe" \
"$(InvalidPerlFolder)"
FunctionEnd
;--------------------------------
Function DownloadImageMagick
${DownloadEnter} \
$ImageMagickPath "Software\ImageMagick\Current" "BinPath" \
"" "" \
1 \
"$(ImageMagickDownloadLabel)" \
"$(ImageMagickFolderLabel)" \
"$(ImageMagickHeader)" \
"$(ImageMagickDescription)"
FunctionEnd
Function DownloadImageMagick_LeaveFunction
${DownloadLeave} \
$DoNotRequireImageMagick \
$DownloadImageMagick \
$ImageMagickPath \
"http://www.imagemagick.org/script/binary-releases.php" \
"$(EnterImageMagickFolder)" \
"\convert.exe" \
"$(InvalidImageMagickFolder)"
FunctionEnd
;--------------------------------
Function DownloadGhostscript
; Find which version of ghostscript, if any, is installed.
EnumRegKey $1 HKLM "Software\AFPL Ghostscript" 0
${if} $1 != ""
StrCpy $0 "Software\AFPL Ghostscript\$1"
${else}
StrCpy $0 ""
${endif}
${DownloadEnter} \
$GhostscriptPath "$0" "GS_DLL" \
"\gsdll32.dll" "" \
1 \
"$(GhostscriptDownloadLabel)" \
"$(GhostscriptFolderLabel)" \
"$(GhostscriptHeader)" \
"$(GhostscriptDescription)"
FunctionEnd
Function DownloadGhostscript_LeaveFunction
${DownloadLeave} \
$DoNotRequireGhostscript \
$DownloadGhostscript \
$GhostscriptPath \
"http://www.cs.wisc.edu/~ghost/doc/AFPL/index.htm" \
"$(EnterGhostscriptFolder)" \
"\gswin32c.exe" \
"$(InvalidGhostscriptFolder)"
FunctionEnd
;--------------------------------
Function SummariseDownloads
StrCpy $PathPrefix ""
${if} $MinSYSPath != ""
StrCpy $PathPrefix "$PathPrefix;$MinSYSPath"
${endif}
${if} $PythonPath != ""
StrCpy $PathPrefix "$PathPrefix;$PythonPath"
${endif}
${if} $MiKTeXPath != ""
StrCpy $PathPrefix "$PathPrefix;$MiKTeXPath"
${endif}
${if} $PerlPath != ""
StrCpy $PathPrefix "$PathPrefix;$PerlPath"
${endif}
${if} $ImageMagickPath != ""
StrCpy $PathPrefix "$PathPrefix;$ImageMagickPath"
${endif}
${if} $GhostscriptPath != ""
StrCpy $PathPrefix "$PathPrefix;$GhostscriptPath"
${endif}
; Remove the leading ';'
StrCpy $PathPrefix "$PathPrefix" "" 1
IntOp $DoNotInstallLyX $DownloadMinSYS + $DownloadPython
IntOp $DoNotInstallLyX $DoNotInstallLyX + $DownloadMiKTeX
IntOp $DoNotInstallLyX $DoNotInstallLyX + $DownloadPerl
IntOp $DoNotInstallLyX $DoNotInstallLyX + $DownloadImageMagick
IntOp $DoNotInstallLyX $DoNotInstallLyX + $DownloadGhostscript
${if} "$DoNotInstallLyX" == 1
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSummary.ini" "Field 1" "Text" "$(SummaryPleaseInstall)"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSummary.ini" "Field 2" "Text" ""
${else}
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSummary.ini" "Field 1" "Text" "$(SummaryPathPrefix)"
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSummary.ini" "Field 2" "Text" "$PathPrefix"
${endif}
!insertmacro MUI_HEADER_TEXT "$(SummaryTitle)" ""
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "ioSummary.ini"
FunctionEnd
Function SummariseDownloads_LeaveFunction
${if} "$DoNotInstallLyX" == 1
Quit
${endif}
FunctionEnd
;--------------------------------
; The Uninstaller
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
; Ascertain whether the user has sufficient privileges to uninstall.
SetShellVarContext current
ReadRegStr $0 HKCU "${PRODUCT_UNINST_KEY}" "RootKey"
${if} $0 == ""
ReadRegStr $0 HKLM "${PRODUCT_UNINST_KEY}" "RootKey"
${if} $0 == ""
MessageBox MB_OK "$(UnNotInRegistryLabel)"
${endif}
${endif}
${if} $0 == "HKLM"
Call un.IsUserAdmin
Pop $0
${if} $0 == "true"
SetShellVarContext all
${else}
MessageBox MB_OK "$(UnNotAdminLabel)"
Abort
${endif}
${endif}
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UnReallyRemoveLabel)" IDYES +2
Abort
FunctionEnd
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(UnRemoveSuccessLabel)"
FunctionEnd
Section Uninstall
RMDir /r $INSTDIR
ReadRegStr $0 ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "StartMenu"
RMDir /r "$0"
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
DeleteRegKey ${PRODUCT_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
${RemoveFileAssociation} "${PRODUCT_EXT}" "${PRODUCT_NAME}"
SetAutoClose true
SectionEnd
; eof

View File

@ -0,0 +1,80 @@
!ifndef _LYX_LANGUAGES_ENGLISH_NSH_
!define _LYX_LANGUAGES_ENGLISH_NSH_
!ifdef LYX_LANG
!undef LYX_LANG
!endif
!define LYX_LANG ${LANG_ENGLISH}
LicenseLangString LyXLicenseData ${LYX_LANG} "${PRODUCT_LICENSE_FILE}"
LangString SecAllUsersTitle "${LYX_LANG}" "Install for all users?"
LangString SecFileAssocTitle "${LYX_LANG}" "File associations"
LangString SecDesktopTitle "${LYX_LANG}" "Desktop icon"
LangString SecCoreDescription "${LYX_LANG}" "The ${PRODUCT_NAME} files."
LangString SecAllUsersDescription "${LYX_LANG}" "Install for all users or just the current user. (Requires Administrator privileges.)"
LangString SecFileAssocDescription "${LYX_LANG}" "Create associations between the executable and the .lyx extension."
LangString SecDesktopDescription "${LYX_LANG}" "A ${PRODUCT_NAME} icon on the desktop."
LangString ModifyingConfigureFailed "${LYX_LANG}" "Failed attempting to set 'path_prefix' in the configure script"
LangString FinishPageMessage "${LYX_LANG}" "Congratulations! LyX has been installed successfully."
LangString FinishPageRun "${LYX_LANG}" "Launch LyX"
LangString DownloadPageField2 "${LYX_LANG}" "&Do not install"
LangString MinSYSHeader "${LYX_LANG}" "MinSYS"
LangString MinSYSDescription "${LYX_LANG}" "MinSYS is a minimal unix scripting environment (www.mingw.org/msys.shtml) which ${PRODUCT_NAME} needs to run a number of scripts."
LangString EnterMinSYSFolder "${LYX_LANG}" "Please input the path to the folder containing MinSYS.exe"
LangString InvalidMinSYSFolder "${LYX_LANG}" "Unable to find MinSYS.exe"
LangString MinSYSDownloadLabel "${LYX_LANG}" "&Download MinSYS"
LangString MinSYSFolderLabel "${LYX_LANG}" "&Folder containing sh.exe"
LangString PythonHeader "${LYX_LANG}" "Python"
LangString PythonDescription "${LYX_LANG}" "The Python scripting language (www.python.org) must be installed or ${PRODUCT_NAME} will be unable to run a number of scripts."
LangString EnterPythonFolder "${LYX_LANG}" "Please input the path to the folder containing Python.exe"
LangString InvalidPythonFolder "${LYX_LANG}" "Unable to find Python.exe"
LangString PythonDownloadLabel "${LYX_LANG}" "&Download Python"
LangString PythonFolderLabel "${LYX_LANG}" "&Folder containing Python.exe"
LangString MiKTeXHeader "${LYX_LANG}" "MiKTeX"
LangString MiKTeXDescription "${LYX_LANG}" "MiKTeX (www.miktex.org) is an up-to-date TeX implementation for Windows."
LangString EnterMiKTeXFolder "${LYX_LANG}" "Please input the path to the folder containing latex.exe"
LangString InvalidMiKTeXFolder "${LYX_LANG}" "Unable to find latex.exe"
LangString MiKTeXDownloadLabel "${LYX_LANG}" "&Download MiKTeX"
LangString MiKTeXFolderLabel "${LYX_LANG}" "&Folder containing latex.exe"
LangString PerlHeader "${LYX_LANG}" "Perl"
LangString PerlDescription "${LYX_LANG}" "If you plan on using reLyX to convert LaTeX documents to LyX ones, then you should install Perl (www.perl.com)."
LangString EnterPerlFolder "${LYX_LANG}" "Please input the path to the folder containing Perl.exe"
LangString InvalidPerlFolder "${LYX_LANG}" "Unable to find Perl.exe"
LangString PerlDownloadLabel "${LYX_LANG}" "&Download Perl"
LangString PerlFolderLabel "${LYX_LANG}" "&Folder containing perl.exe"
LangString ImageMagickHeader "${LYX_LANG}" "ImageMagick"
LangString ImageMagickDescription "${LYX_LANG}" "The ImageMagick tools (www.imagemagick.org/script/index.php) can be used to convert graphics files to whatever output format is needed."
LangString EnterImageMagickFolder "${LYX_LANG}" "Please input the path to the folder containing convert.exe"
LangString InvalidImageMagickFolder "${LYX_LANG}" "Unable to find convert.exe"
LangString ImageMagickDownloadLabel "${LYX_LANG}" "&Download ImageMagick"
LangString ImageMagickFolderLabel "${LYX_LANG}" "&Folder containing convert.exe"
LangString GhostscriptHeader "${LYX_LANG}" "Ghostscript"
LangString GhostscriptDescription "${LYX_LANG}" "Ghostscript (http://www.cs.wisc.edu/~ghost/) is used to convert images to/from PostScript."
LangString EnterGhostscriptFolder "${LYX_LANG}" "Please input the path to the folder containing gswin32c.exe"
LangString InvalidGhostscriptFolder "${LYX_LANG}" "Unable to find gswin32c.exe"
LangString GhostscriptDownloadLabel "${LYX_LANG}" "&Download Ghostscript"
LangString GhostscriptFolderLabel "${LYX_LANG}" "&Folder containing gswin32c.exe"
LangString SummaryTitle "${LYX_LANG}" "Software summary"
LangString SummaryPleaseInstall "${LYX_LANG}" "Please install your downloaded files and then run LyX's installer once again."
LangString SummaryPathPrefix "${LYX_LANG}" "I shall add a 'path_prefix' string to 'lyxrc.defaults' containing:$\r$\n$PathPrefix"
LangString UnNotInRegistryLabel "${LYX_LANG}" "Unable to find $(^Name) in the registry$\r$\nShortcuts on the desktop and in the Start Menu will not be removed."
LangString UnNotAdminLabel "${LYX_LANG}" "Sorry! You must have administrator privileges$\r$\nto uninstall $(^Name)."
LangString UnReallyRemoveLabel "${LYX_LANG}" "Are you sure you want to completely remove $(^Name) and all of its components?"
LangString UnRemoveSuccessLabel "${LYX_LANG}" "$(^Name) was successfully removed from your computer."
!undef LYX_LANG
!endif ; _LYX_LANGUAGES_ENGLISH_NSH_

View File

@ -0,0 +1,80 @@
!ifndef _LYX_LANGUAGES_FRENCH_NSH_
!define _LYX_LANGUAGES_FRENCH_NSH_
!ifdef LYX_LANG
!undef LYX_LANG
!endif
!define LYX_LANG ${LANG_FRENCH}
LicenseLangString LyXLicenseData ${LYX_LANG} "${PRODUCT_LICENSE_FILE}"
LangString SecAllUsersTitle "${LYX_LANG}" "Install for all users?"
LangString SecFileAssocTitle "${LYX_LANG}" "File associations"
LangString SecDesktopTitle "${LYX_LANG}" "Desktop icon"
LangString SecCoreDescription "${LYX_LANG}" "The ${PRODUCT_NAME} files."
LangString SecAllUsersDescription "${LYX_LANG}" "Install for all users or just the current user. (Requires Administrator privileges.)"
LangString SecFileAssocDescription "${LYX_LANG}" "Create associations between the executable and the .lyx extension."
LangString SecDesktopDescription "${LYX_LANG}" "A ${PRODUCT_NAME} icon on the desktop."
LangString ModifyingConfigureFailed "${LYX_LANG}" "Failed attempting to set 'path_prefix' in the configure script"
LangString FinishPageMessage "${LYX_LANG}" "Congratulations! LyX has been installed successfully."
LangString FinishPageRun "${LYX_LANG}" "Launch LyX"
LangString DownloadPageField2 "${LYX_LANG}" "&Do not install"
LangString MinSYSHeader "${LYX_LANG}" "MinSYS"
LangString MinSYSDescription "${LYX_LANG}" "MinSYS is a minimal unix scripting environment (www.mingw.org/msys.shtml) which ${PRODUCT_NAME} needs to run a number of scripts."
LangString EnterMinSYSFolder "${LYX_LANG}" "Please input the path to the folder containing MinSYS.exe"
LangString InvalidMinSYSFolder "${LYX_LANG}" "Unable to find MinSYS.exe"
LangString MinSYSDownloadLabel "${LYX_LANG}" "&Download MinSYS"
LangString MinSYSFolderLabel "${LYX_LANG}" "&Folder containing sh.exe"
LangString PythonHeader "${LYX_LANG}" "Python"
LangString PythonDescription "${LYX_LANG}" "The Python scripting language (www.python.org) must be installed or ${PRODUCT_NAME} will be unable to run a number of scripts."
LangString EnterPythonFolder "${LYX_LANG}" "Please input the path to the folder containing Python.exe"
LangString InvalidPythonFolder "${LYX_LANG}" "Unable to find Python.exe"
LangString PythonDownloadLabel "${LYX_LANG}" "&Download Python"
LangString PythonFolderLabel "${LYX_LANG}" "&Folder containing Python.exe"
LangString MiKTeXHeader "${LYX_LANG}" "MiKTeX"
LangString MiKTeXDescription "${LYX_LANG}" "MiKTeX (www.miktex.org) is an up-to-date TeX implementation for Windows."
LangString EnterMiKTeXFolder "${LYX_LANG}" "Please input the path to the folder containing latex.exe"
LangString InvalidMiKTeXFolder "${LYX_LANG}" "Unable to find latex.exe"
LangString MiKTeXDownloadLabel "${LYX_LANG}" "&Download MiKTeX"
LangString MiKTeXFolderLabel "${LYX_LANG}" "&Folder containing latex.exe"
LangString PerlHeader "${LYX_LANG}" "Perl"
LangString PerlDescription "${LYX_LANG}" "If you plan on using reLyX to convert LaTeX documents to LyX ones, then you should install Perl (www.perl.com)."
LangString EnterPerlFolder "${LYX_LANG}" "Please input the path to the folder containing Perl.exe"
LangString InvalidPerlFolder "${LYX_LANG}" "Unable to find Perl.exe"
LangString PerlDownloadLabel "${LYX_LANG}" "&Download Perl"
LangString PerlFolderLabel "${LYX_LANG}" "&Folder containing perl.exe"
LangString ImageMagickHeader "${LYX_LANG}" "ImageMagick"
LangString ImageMagickDescription "${LYX_LANG}" "The ImageMagick tools (www.imagemagick.org/script/index.php) can be used to convert graphics files to whatever output format is needed."
LangString EnterImageMagickFolder "${LYX_LANG}" "Please input the path to the folder containing convert.exe"
LangString InvalidImageMagickFolder "${LYX_LANG}" "Unable to find convert.exe"
LangString ImageMagickDownloadLabel "${LYX_LANG}" "&Download ImageMagick"
LangString ImageMagickFolderLabel "${LYX_LANG}" "&Folder containing convert.exe"
LangString GhostscriptHeader "${LYX_LANG}" "Ghostscript"
LangString GhostscriptDescription "${LYX_LANG}" "Ghostscript (http://www.cs.wisc.edu/~ghost/) is used to convert images to/from PostScript."
LangString EnterGhostscriptFolder "${LYX_LANG}" "Please input the path to the folder containing gswin32c.exe"
LangString InvalidGhostscriptFolder "${LYX_LANG}" "Unable to find gswin32c.exe"
LangString GhostscriptDownloadLabel "${LYX_LANG}" "&Download Ghostscript"
LangString GhostscriptFolderLabel "${LYX_LANG}" "&Folder containing gswin32c.exe"
LangString SummaryTitle "${LYX_LANG}" "Software summary"
LangString SummaryPleaseInstall "${LYX_LANG}" "Please install your downloaded files and then run LyX's installer once again."
LangString SummaryPathPrefix "${LYX_LANG}" "I shall add a 'path_prefix' string to 'lyxrc.defaults' containing:$\r$\n$PathPrefix"
LangString UnNotInRegistryLabel "${LYX_LANG}" "Unable to find $(^Name) in the registry$\r$\nShortcuts on the desktop and in the Start Menu will not be removed."
LangString UnNotAdminLabel "${LYX_LANG}" "Sorry! You must have administrator privileges$\r$\nto uninstall $(^Name)."
LangString UnReallyRemoveLabel "${LYX_LANG}" "Are you sure you want to completely remove $(^Name) and all of its components?"
LangString UnRemoveSuccessLabel "${LYX_LANG}" "$(^Name) was successfully removed from your computer."
!undef LYX_LANG
!endif ; _LYX_LANGUAGES_FRENCH_NSH_

View File

@ -0,0 +1,80 @@
!ifndef _LYX_LANGUAGES_GERMAN_NSH_
!define _LYX_LANGUAGES_GERMAN_NSH_
!ifdef LYX_LANG
!undef LYX_LANG
!endif
!define LYX_LANG ${LANG_GERMAN}
LicenseLangString LyXLicenseData ${LYX_LANG} "${PRODUCT_LICENSE_FILE}"
LangString SecAllUsersTitle "${LYX_LANG}" "Install for all users?"
LangString SecFileAssocTitle "${LYX_LANG}" "File associations"
LangString SecDesktopTitle "${LYX_LANG}" "Desktop icon"
LangString SecCoreDescription "${LYX_LANG}" "The ${PRODUCT_NAME} files."
LangString SecAllUsersDescription "${LYX_LANG}" "Install for all users or just the current user. (Requires Administrator privileges.)"
LangString SecFileAssocDescription "${LYX_LANG}" "Create associations between the executable and the .lyx extension."
LangString SecDesktopDescription "${LYX_LANG}" "A ${PRODUCT_NAME} icon on the desktop."
LangString ModifyingConfigureFailed "${LYX_LANG}" "Failed attempting to set 'path_prefix' in the configure script"
LangString FinishPageMessage "${LYX_LANG}" "Congratulations! LyX has been installed successfully."
LangString FinishPageRun "${LYX_LANG}" "Launch LyX"
LangString DownloadPageField2 "${LYX_LANG}" "&Do not install"
LangString MinSYSHeader "${LYX_LANG}" "MinSYS"
LangString MinSYSDescription "${LYX_LANG}" "MinSYS is a minimal unix scripting environment (www.mingw.org/msys.shtml) which ${PRODUCT_NAME} needs to run a number of scripts."
LangString EnterMinSYSFolder "${LYX_LANG}" "Please input the path to the folder containing MinSYS.exe"
LangString InvalidMinSYSFolder "${LYX_LANG}" "Unable to find MinSYS.exe"
LangString MinSYSDownloadLabel "${LYX_LANG}" "&Download MinSYS"
LangString MinSYSFolderLabel "${LYX_LANG}" "&Folder containing sh.exe"
LangString PythonHeader "${LYX_LANG}" "Python"
LangString PythonDescription "${LYX_LANG}" "The Python scripting language (www.python.org) must be installed or ${PRODUCT_NAME} will be unable to run a number of scripts."
LangString EnterPythonFolder "${LYX_LANG}" "Please input the path to the folder containing Python.exe"
LangString InvalidPythonFolder "${LYX_LANG}" "Unable to find Python.exe"
LangString PythonDownloadLabel "${LYX_LANG}" "&Download Python"
LangString PythonFolderLabel "${LYX_LANG}" "&Folder containing Python.exe"
LangString MiKTeXHeader "${LYX_LANG}" "MiKTeX"
LangString MiKTeXDescription "${LYX_LANG}" "MiKTeX (www.miktex.org) is an up-to-date TeX implementation for Windows."
LangString EnterMiKTeXFolder "${LYX_LANG}" "Please input the path to the folder containing latex.exe"
LangString InvalidMiKTeXFolder "${LYX_LANG}" "Unable to find latex.exe"
LangString MiKTeXDownloadLabel "${LYX_LANG}" "&Download MiKTeX"
LangString MiKTeXFolderLabel "${LYX_LANG}" "&Folder containing latex.exe"
LangString PerlHeader "${LYX_LANG}" "Perl"
LangString PerlDescription "${LYX_LANG}" "If you plan on using reLyX to convert LaTeX documents to LyX ones, then you should install Perl (www.perl.com)."
LangString EnterPerlFolder "${LYX_LANG}" "Please input the path to the folder containing Perl.exe"
LangString InvalidPerlFolder "${LYX_LANG}" "Unable to find Perl.exe"
LangString PerlDownloadLabel "${LYX_LANG}" "&Download Perl"
LangString PerlFolderLabel "${LYX_LANG}" "&Folder containing perl.exe"
LangString ImageMagickHeader "${LYX_LANG}" "ImageMagick"
LangString ImageMagickDescription "${LYX_LANG}" "The ImageMagick tools (www.imagemagick.org/script/index.php) can be used to convert graphics files to whatever output format is needed."
LangString EnterImageMagickFolder "${LYX_LANG}" "Please input the path to the folder containing convert.exe"
LangString InvalidImageMagickFolder "${LYX_LANG}" "Unable to find convert.exe"
LangString ImageMagickDownloadLabel "${LYX_LANG}" "&Download ImageMagick"
LangString ImageMagickFolderLabel "${LYX_LANG}" "&Folder containing convert.exe"
LangString GhostscriptHeader "${LYX_LANG}" "Ghostscript"
LangString GhostscriptDescription "${LYX_LANG}" "Ghostscript (http://www.cs.wisc.edu/~ghost/) is used to convert images to/from PostScript."
LangString EnterGhostscriptFolder "${LYX_LANG}" "Please input the path to the folder containing gswin32c.exe"
LangString InvalidGhostscriptFolder "${LYX_LANG}" "Unable to find gswin32c.exe"
LangString GhostscriptDownloadLabel "${LYX_LANG}" "&Download Ghostscript"
LangString GhostscriptFolderLabel "${LYX_LANG}" "&Folder containing gswin32c.exe"
LangString SummaryTitle "${LYX_LANG}" "Software summary"
LangString SummaryPleaseInstall "${LYX_LANG}" "Please install your downloaded files and then run LyX's installer once again."
LangString SummaryPathPrefix "${LYX_LANG}" "I shall add a 'path_prefix' string to 'lyxrc.defaults' containing:$\r$\n$PathPrefix"
LangString UnNotInRegistryLabel "${LYX_LANG}" "Unable to find $(^Name) in the registry$\r$\nShortcuts on the desktop and in the Start Menu will not be removed."
LangString UnNotAdminLabel "${LYX_LANG}" "Sorry! You must have administrator privileges$\r$\nto uninstall $(^Name)."
LangString UnReallyRemoveLabel "${LYX_LANG}" "Are you sure you want to completely remove $(^Name) and all of its components?"
LangString UnRemoveSuccessLabel "${LYX_LANG}" "$(^Name) was successfully removed from your computer."
!undef LYX_LANG
!endif ; _LYX_LANGUAGES_GERMAN_NSH_

View File

@ -0,0 +1,135 @@
/*
* \file lyx_path_prefix.C
* This file is part of LyX, the document processor.
* http://www.lyx.org/
* Licence details can be found in the file COPYING or copy at
* http://www.lyx.org/about/license.php3
* \author Angus Leeming
* Full author contact details are available in file CREDITS or copy at
* http://www.lyx.org/about/credits.php
*
* This little piece of code is used to insert some code into LyX's
* Resources/lyx/configure script so that it will cause lyxrc.defaults to
* contain
*
* \path_prefix "<path to sh.exe>;<path to python.exe>;..."
*
* Compile the code with
*
* g++ -I/c/Program\ Files/NSIS/Contrib -Wall -shared \
* lyx_path_prefix.c -o lyx_path_prefix.dll
*
* Move resulting .dll to /c/Program\ Files/NSIS/Plugins
*/
#include <windows.h>
#include "ExDLL/exdll.h"
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
namespace {
std::string const subst(std::string const & a,
std::string const & oldstr,
std::string const & newstr)
{
std::string lstr = a;
std::string::size_type i = 0;
std::string::size_type const olen = oldstr.length();
while ((i = lstr.find(oldstr, i)) != std::string::npos) {
lstr.replace(i, olen, newstr);
i += newstr.length(); // We need to be sure that we dont
// use the same i over and over again.
}
return lstr;
}
} // namespace anon
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
extern "C"
void __declspec(dllexport) set(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
{
char configure_file[MAX_PATH];
char path_prefix[MAX_PATH];
EXDLL_INIT();
popstring(configure_file);
popstring(path_prefix);
std::fstream fs(configure_file);
if (!fs) {
pushstring("-1");
return;
}
std::istreambuf_iterator<char> const begin(fs);
std::istreambuf_iterator<char> const end;
std::string configure_data(begin, end);
std::string::size_type const xfonts_pos = configure_data.find("X FONTS");
if (xfonts_pos == std::string::npos) {
pushstring("-1");
return;
}
std::string::size_type const xfonts_start =
configure_data.find_last_of('\n', xfonts_pos);
if (xfonts_start == std::string::npos) {
pushstring("-1");
return;
}
fs.seekg(0);
fs << configure_data.substr(0, xfonts_start)
<< "\n"
"cat >>$outfile <<EOF\n"
"\n"
"\\\\path_prefix \"" << subst(path_prefix, "\\", "\\\\") << "\"\n"
"EOF\n"
<< configure_data.substr(xfonts_start);
// Now we've rebuilt configure, run it to generate things like
// lyxrc.defaults.
std::string configure_dir(configure_file);
std::string::size_type const final_slash = configure_dir.find_last_of('\\');
if (final_slash == std::string::npos) {
pushstring("-1");
return;
}
configure_dir = configure_dir.substr(0, final_slash);
if (SetCurrentDirectory(configure_dir.c_str()) == 0) {
pushstring("-1");
return;
}
char path[MAX_PATH];
if (GetEnvironmentVariable("PATH", path, MAX_PATH) == 0) {
pushstring("-1");
return;
}
std::string const path_str = std::string(path_prefix) + ';' + path;
if (SetEnvironmentVariable("PATH", path_str.c_str()) == 0) {
pushstring("-1");
return;
}
if (system("start /min sh.exe configure") != 0) {
pushstring("-1");
return;
}
pushstring("0");
}

View File

@ -0,0 +1,14 @@
!ifndef _LYX_FUNC_NSH_
!define _LYX_FUNC_NSH_
!macro LYX_DEFFUNC Name
!define `${Name}` `!insertmacro LYX_FUNCTION_${Name}`
!macroend
!macro LYX_FUNC ShortName
!undef `${ShortName}`
!define `${ShortName}` `!insertmacro LYX_FUNCTION_${ShortName}_Call`
Function `${ShortName}`
!macroend
!endif ; _LYX_FUNC_NSH_

View File

@ -0,0 +1,53 @@
!ifndef _STRTRIM_NSH_
!define _STRTRIM_NSH_
!include "lyxfunc.nsh"
!insertmacro LYX_DEFFUNC `StrTrim`
!macro LYX_FUNCTION_StrTrim
!insertmacro LYX_FUNC `StrTrim`
; After this point:
; $0 = String (input)
; $1 = Temp (temp)
; Get input from user
Exch $0
Push $1
Loop:
StrCpy $1 "$0" 1
StrCmp "$1" " " TrimLeft
StrCmp "$1" "$\r" TrimLeft
StrCmp "$1" "$\n" TrimLeft
StrCmp "$1" " " TrimLeft ; this is a tab.
GoTo Loop2
TrimLeft:
StrCpy $0 "$0" "" 1
Goto Loop
Loop2:
StrCpy $1 "$0" 1 -1
StrCmp "$1" " " TrimRight
StrCmp "$1" "$\r" TrimRight
StrCmp "$1" "$\n" TrimRight
StrCmp "$1" " " TrimRight ; this is a tab
GoTo Done
TrimRight:
StrCpy $0 "$0" -1
Goto Loop2
Done:
Pop $1
Exch $0
FunctionEnd
!macroend
!macro LYX_FUNCTION_StrTrim_Call String
Push `${String}`
Call StrTrim
Pop `${String}`
!macroend
!endif ; _STRTRIM_NSH_

View File

@ -0,0 +1,111 @@
#! /bin/sh
# This script aims to do averything necessary to automate the packaging
# of LyX/Win ready for an Windows Installer to be built.
# It copies these files into the appropriate places in the LyX tree.
# qt-mt3.dll
# libiconv-2.dll
# mingw10.dll
# clean_dvi.py
# dv2dt.exe
# dt2dv.exe
# It strips the executables.
# It adds formats and converters to the Resources/lyx/configure script to
# ensure that the generated .dvi file is usable.
# It removes all stuff generated by running configure:
# xfonts/
# doc/LaTeXConfig.lyx
# lyxrc.defaults
# packages.lst
# textclass.lst
# The installee should regenerate them by running configure on his machine.
QT_DLL="$HOME/qt3/bin/qt-mt3.dll"
LIBICONV_DLL="/j/MinGW/bin/libiconv-2.dll"
MINGW_DLL="/j/MinGW/bin/mingwm10.dll"
CLEAN_DVI_PY="clean_dvi.py"
DTL_DIR=dtl
DT2DV="$DTL_DIR/dt2dv.exe"
DV2DT="$DTL_DIR/dv2dt.exe"
LYX_INSTALL_DIR="/j/Programs/LyX"
# Change this to 'mv -f' when you are confident that
# the various sed scripts are working correctly.
MV='mv -f'
windows_packaging()
{
# Install the necessary .dlls and clean_dvi stuff.
for file in "${QT_DLL}" "${LIBICONV_DLL}" "${MINGW_DLL}" "${DT2DV}" "${DV2DT}"
do
cp "${file}" "$LYX_INSTALL_DIR"/bin/. || {
echo "Failed to copy ${file} to the LyX package" >&2
exit 1
}
done
cp "${CLEAN_DVI_PY}" "$LYX_INSTALL_DIR"/Resources/lyx/scripts/. || {
echo "Failed to copy ${CLEAN_DVI_PY} to the LyX package" >&2
exit 1
}
# Strip the executables
(
cd "${LYX_INSTALL_DIR}/bin"
for file in *.exe
do
strip $file
done
)
# Modify the configure script,
# * add a dvi2 format
# * change the latex->dvi converter to latex->dvi2
# * add a dvi2->dvi converter
# * fix the generated chkconfig.sed so that it works with versions of
# sed that get confused by sed scripts with DOS line endings.
TMP=tmp.$$
CONFIGURE="${LYX_INSTALL_DIR}"/Resources/lyx/configure
# Do this to make it easy to compare the before and after files.
dos2unix "${CONFIGURE}"
sed '
# (Note that this sed script contains TAB characters.)
# Append the dvi2 format after the dvi format.
/^ *\\\\Format[ ]\{1,\}dvi[ ]\{1,\}/a\
\\\\Format dvi2 dvi DirtyDVI ""
# Change the latex->dvi converter to latex->dvi2
# and append the dvi2->dvi converter
/^ *\\\\converter[ ]\{1,\}latex[ ]\{1,\}dvi[ ]\{1,\}/{
s/dvi/dvi2/
a\
\\\\converter dvi2 dvi "python \\\$\\\$s/scripts/clean_dvi.py \\\$\\\$i \\\$\\\$o" ""
}
' "${CONFIGURE}" > "${TMP}"
cmp -s "${CONFIGURE}" "${TMP}" || {
diff -u "${CONFIGURE}" "${TMP}"
${MV} "${TMP}" "${CONFIGURE}"
}
rm -f "${TMP}"
# Strip the executables
(
cd "${LYX_INSTALL_DIR}/Resources/lyx"
rm -rf xfonts
for file in doc/LaTeXConfig.lyx lyxrc.defaults packages.lst textclass.lst
do
rm -f $file
done
)
}
windows_packaging || exit 1
# The end