I appreciate the answer of @egreg and I based my own solution on it, since I wrote a book that uses TL 2017 but I wanted to do package maintenance using TL 2019.
Since, however, Debian-based systems will not work well with this solution due to how they compile sudo
, I created a solution and a BASH script at: https://github.com/ServusCarolus/tl-switch
Further below is the README.md file from the repo as of this post. Here is the TL;DR:
I downloaded the net installer for TexLive 2019 and installed it as root under the default: /usr/local/texlive/2019
I did this for root and for my normal user account:
sudo mkdir -p /opt/tex/root
sudo mkdir /opt/tex/charles
sudo chown charles:charles /opt/tex/charles
I modded root's .bashrc
and my user .profile
like so:
if [ -d "/opt/tex/$USER/bin" ] ; then
PATH="/opt/tex/$USER/bin:$PATH"
fi
I installed the script as shown in the README below on my 32-bit machine and my 64-bit machine. The script knows how to find both binary directory types.
As a normal user, I can switch TL distributions without becoming root simply by typing tl-switch yes
and tl-switch no
. When new releases appear, I can switch via tl-switch yes 2020
and so on.
Similar to the answer above, the script either creates or destroys a symlink to the vanilla TL distribution(s) in the user's writable directory under /opt/tex
But it does some error checking in the process and saves time.
I become root via sudo su
and I can switch distributions the same way, update and do maintenance with tlmgr
and do so without altering the context of my normal user. Moreover, this approach scales to as many users and TL distributions that I might want.
Below I talk about other possible solutions because different people have different needs. But at least this approach might help avoid the automatic fallback to the distro packages due to sudo
and secure_path
. Thanks again to @egreg for providing a good basis and framework.
tl-switch
Switch context between vanilla TeXLive installed under /usr/local/texlive and the Linux distro version of TeXLive installed on a system like Debian, Ubuntu, Mint, etc.
The script and installation are based on ths answers at:
Multiple TeXlive installations
Caveat: A Word about sudo
Even if one creates a shell script in /etc/profile.d
in order to put a symbolic link to the vanilla TL path before /usr/bin
in the command search path, the sudo
command will not follow the link by default.
The issue is that Debian and friends build sudo
to use secure_path
. There are various workarounds to this issue, depending on the user's preference. See:
https://stackoverflow.com/questions/257616/why-does-sudo-change-the-path
When installing vanilla TL as root and using this script, one must type, e.g., sudo su
to switch contexts to the superuser before running tlmgr
. Alternatives include:
The least invasive route, e.g.:
sudo env PATH=$PATH tlmgr -gui
Use the common group route below and do not use sudo
, but set the directories to exist under /usr/local/texlive/
as you would, had you installed via sudo
.
Redefine sudo
in various ways, as the link above discusses. YMMV.
Regardless of the issues above, normal use works as expected.
Observe caution when editing files. For example, sudo echo "$USER"
should point to the regular user, not root. That means one should avoid shortcuts like ~./
in file paths. One should use unambiguous, full paths.
Although the GUI interface of tlmgr
will not create files owned by root when run via sudo
, one should avoid using many desktop-integrated GUI programs while running sudo
. Doing so may create files owned by root in one's home directory tree. That can prevent user programs from saving information properly.
To do a full context switch, do either su
or sudo su
, depending on the distribution.
Excursus: Make a Group
Another way to avoid problems with sudo
is to make the TeXLive installation writeable to all TeX users. The problem here is that chaos might ensue if multiple users meddle with the installation. We include this for completeness:
sudo addgroup texusers
sudo addgroup "$USER" texusers
sudo mkdir -p /usr/local/texlive
sudo chgrp -R texusers /usr/local/texlive
sudo chmod -R 2775 /usr/local/texlive
Note that adduser and addgroup are Debian-isms; other distributions (and Debian-based ones too) have the commands useradd
and groupadd
. See the man pages for those commands. Thus, you would use instead:
sudo groupadd texusers
sudo usermod -a -G texusers "$USER"
Then one can install TL as part of the texusers group.
See also: https://www.tecmint.com/create-a-shared-directory-in-linux/
Step 1: Install Vanilla TL
For installing vanilla TL see: https://www.tug.org/texlive/acquire.html
Note: Never install the symbolic links when installing vanilla TL.
Step 2: Create Directories
We create paths for each user to create directory links:
sudo mkdir -p /opt/tex/root
sudo mkdir "/opt/tex/$USER"
sudo chown "$USER":$USER" "/opt/tex/$USER"
We repeat the final two lines for each user, most likely substituting each username for $USER, e.g.:
sudo mkdir /opt/tex/bob
sudo chown bob:bob /opt/tex/bob
Step 3: Modifying profiles
We put this snippet in each user's .profile
and in root's .bashrc
:
if [ -d "/opt/tex/$USER/bin" ] ; then
PATH="/opt/tex/$USER/bin:$PATH"
fi
Another approach would put the snippet in everyone's .bashrc
, then add source .bashrc
to everyone's .profile
. That would renew the path environment every time one opens a terminal. Or one can set terminals to open a login shell.
When editing root's .bashrc
, remember to use sudo su
or specify /root/.bashrc
as the file. Otherwise sudo nano ~/.bashrc
refers to the user's .bashrc
file instead.
Step 4: Install the Script
We go to the directory where we downloaded or cloned the repository and locate the tl-switch
script. We then type:
sudo cp ./tl-switch /usr/local/bin
chmod +x /usr/local/bin/tl-switch
All users now will have access to running the script.
Step 5: Reboot
After the install procedure is done, it is good to restart the machine before using TeXLive so that the paths for root and the users can be updated properly.
Step 6: Switching to and from Vanilla TeXLive
When a user (or root) wants to enable access to vanilla TL 2019, one need only type:
tl-switch yes
To specify another installation under /usr/local/texlive
, use, e.g.:
tl-switch yes 2018
To disable vanilla TL and use the distro version, one need only type:
tl-switch no
If one changes context in the middle of a session, the search paths will not change. One way to tackle that (somewhat) is mentioned in Step 3 above.
Final Thoughts
An immediate downside to this method is needing to, e.g., sudo su
to switch contexts to the superuser before running tlmgr
. Its benefits include isolating users from each other and allowing one to change contexts without extensive system modification. Yet contexts only should be changed before logging out and back in again to avoid problems.
/usr/bin
, then calling/usr/bin/pdflatex
will run the TL 2011 binary and use the corresponding TeX tree.texdoc
ordvips
or eventlmgr
? How to fix it? Setting up the$PATH
is not enough?$PATH
is surely enough for using the most recent release. You can always change it in a shell to use the old release.