diff --git a/src/ext/texlive/SPKG.txt b/src/ext/texlive/SPKG.txt new file mode 100644 index 00000000000..52ddc9aec9b --- /dev/null +++ b/src/ext/texlive/SPKG.txt @@ -0,0 +1,33 @@ += TeXlive = + +== Description == + +TeX Live is an easy way to get up and running with the TeX document +production system. It provides a comprehensive TeX system with +binaries for most flavors of Unix, including GNU/Linux, and also +Windows. It includes all the major TeX-related programs, macro +packages, and fonts that are free software, including support for many +languages around the world. + +This package installs all texlive packages requried to build Sage. If +necessary, texlive itself is installed. + +== License == + +Various FSF-approved free software licenses. See +https://www.tug.org/texlive/copying.html for details. + +== Upstream Contact == + +Hoem page: https://www.tug.org/texlive + +== Dependencies == + +Put a bulleted list of dependencies here: + +* python + +== Special Update/Build Instructions == + +This package requires internet access to download texlive packages for +the TeX mirrors. diff --git a/src/ext/texlive/package-list.txt b/src/ext/texlive/package-list.txt new file mode 100644 index 00000000000..6975cc59973 --- /dev/null +++ b/src/ext/texlive/package-list.txt @@ -0,0 +1,42 @@ +# Here is the list of TeXlive packages required by Sage. +# +# Note: +# - Dependencies are installed automatically by TeXlive. +# - Whitespace and Lines starting with a hash are ignored. + + +latex +titlesec +framed +threeparttable +wrapfig +multirow +makecmds +collection-fontsrecommended + +# Some dependencies that TeXlive 2014 missed +cmap +fancybox +fancyvrb +mdwtools +parskip +jknapltx +etoolbox + +# Language support for localizations of the Sage docs +collection-langcyrillic +babel-basque +babel-catalan +babel-czech +babel-english +babel-french +babel-galician +babel-german +babel-hungarian +babel-italian +babel-polish +babel-portuges +babel-russian +babel-slovak +babel-spanish + diff --git a/src/ext/texlive/texlive-install b/src/ext/texlive/texlive-install new file mode 100755 index 00000000000..8fd2ccf73f0 --- /dev/null +++ b/src/ext/texlive/texlive-install @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +import os +import sys +import glob +from subprocess import check_call, CalledProcessError + +try: + SAGE_LOCAL = os.environ['SAGE_LOCAL'] + DOT_SAGE = os.environ['DOT_SAGE'] +except KeyError: + print('You need to run this script in a Sage shell ("sage -sh")') + sys.exit(1) + + +TEXLIVE_INSTALL_UNIX_URL = \ + 'http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz' + +TEXLIVE_PROFILE_TEMPLATE = \ +""" +selected_scheme scheme-minimal +TEXDIR {SAGE_LOCAL}/share/texlive +TEXMFLOCAL {SAGE_LOCAL}/share/texlive/texmf-local +TEXMFSYSCONFIG {SAGE_LOCAL}/share/texlive/texmf-config +TEXMFSYSVAR {SAGE_LOCAL}/share/texlive/texmf-var +TEXMFCONFIG {DOT_SAGE}/texlive/texmf-config +TEXMFHOME {DOT_SAGE}/texlive/texmf-home +TEXMFVAR {DOT_SAGE}/texlive/texmf-var +collection-basic 1 +in_place 0 +option_adjustrepo 1 +option_autobackup 1 +option_backupdir tlpkg/backups +option_desktop_integration 1 +option_doc 1 +option_file_assocs 1 +option_fmt 1 +option_letter 0 +option_menu_integration 1 +option_path 1 +option_post_code 1 +option_src 1 +option_sys_bin {SAGE_LOCAL}/bin +option_sys_info {SAGE_LOCAL}/share/info +option_sys_man {SAGE_LOCAL}/share/man +option_w32_multi_user 1 +option_write18_restricted 1 +portable 0 +""" + + +def have_texlive(): + try: + check_call(['tlmgr', '--version']) + return True + except (OSError, CalledProcessError): + return False + + +def download_install_script(tarball): + try: + from urllib import urlretrieve + except ImportError: + from urllib.request import urlretrieve + urlretrieve(TEXLIVE_INSTALL_UNIX_URL, tarball) + + +def write_profile(filename): + profile = TEXLIVE_PROFILE_TEMPLATE.format( + SAGE_LOCAL=SAGE_LOCAL, DOT_SAGE=DOT_SAGE) + with open(filename, 'w') as f: + f.write(profile) + print('TeXlive unattended install profile: {0}'.format(filename)) + +def install_texlive(): + import tempfile + tmp_dir = tempfile.mkdtemp() + tarball = os.path.join(tmp_dir, 'install-tl-unx.tar.gz') + profile = os.path.join(tmp_dir, 'sage.profile') + download_install_script(tarball) + write_profile(profile) + + original_dir = os.getcwd() + os.chdir(tmp_dir) + check_call(['tar', '-x', '-z', '-f', tarball]) + install_dir = glob.glob('install-tl-*')[0] + os.chdir(install_dir) + + check_call([ + './install-tl', + '-profile', + profile + ]) + os.chdir(original_dir) + + +def install_packages(): + package_list_txt = os.path.join( + os.path.dirname(__file__), + 'package-list.txt' + ) + with open(package_list_txt) as f: + package_list = f.read() + packages = [] + for pkg in package_list.splitlines(): + pkg = pkg.strip() + if len(pkg) == 0: + continue + if pkg.startswith('#'): + continue + packages.append(pkg) + print('installing the following TeXlive packages:') + for pkg in packages: + print(' * ' + pkg) + check_call(['tlmgr', 'install'] + packages) + check_call(['tlmgr', 'path', 'add']) + + +if __name__ == '__main__': + if have_texlive(): + print('Using your own texlive install (see "tlmgr --version")') + else: + print('Performing minimal texlive install into {0}' + .format(SAGE_LOCAL)) + install_texlive() + install_packages() +