A streamlined guide to setting up LaTeX on Ubuntu ARM servers and using it with VS Code
What is LaTeX?
LaTeX (pronounced “LAH-tech” or “LAY-tech”) is a high-quality typesetting system designed for the production of technical and scientific documents. Unlike traditional word processors like Microsoft Word, LaTeX uses a markup language approach where you write plain text with formatting commands, and the system compiles it into beautifully formatted PDFs.
Why Use LaTeX?
- Professional Typography: Produces publication-quality documents with superior typography
- Mathematical Expressions: Unmatched support for complex mathematical formulas and equations
- Consistent Formatting: Automatic handling of numbering, cross-references, and citations
- Version Control Friendly: Plain text files work perfectly with Git and other version control systems
- Academic Standard: Widely used in academia, research, and scientific publishing
- Separation of Content and Style: Focus on writing while LaTeX handles the formatting
LaTeX vs. Overleaf
While Overleaf is a popular online LaTeX editor, setting up LaTeX locally with VS Code offers several advantages:
- Offline Access: Work without internet connection
- Better Performance: No upload/download delays
- Full Control: Complete customization of your environment
- Integration: Seamless integration with your existing development workflow
- Privacy: Keep sensitive documents on your local machine
- Cost: Free alternative to Overleaf’s premium plans
Table of Contents
- What is LaTeX?
- Quick Installation
- VS Code Configuration
- Recommended Project Structure
- LaTeX Command Cheat Sheet
- Emoji Support
- Essential Keyboard Shortcuts
- Common Issues & Solutions
- Changing Fonts
- Quick Test Document
- Useful Resources
Quick Installation
Prerequisites
# Verify requirements df -h /usr/local # Need 5GB+ free space sudo -v # Confirm sudo access code --version # Verify VS Code installed
Installation (10 minutes)
# 1. Update and install LaTeX sudo apt update sudo apt install texlive-full # 2. Install fonts for emoji and symbols sudo apt install fonts-noto-color-emoji fonts-noto fonts-dejavu fonts-liberation # 3. Refresh font cache fc-cache -fv # 4. Verify installation pdflatex --version lualatex --version fc-list | grep -i emoji
Install VS Code Extension
# In VS Code Quick Open (Ctrl+P): ext install James-Yu.latex-workshop
VS Code Configuration
Create .vscode/settings.json
in your project root:
{ // === Build Configuration === "latex-workshop.latex.autoBuild.run": "onSave", "latex-workshop.latex.outDir": "./build", "latex-workshop.latex.autoClean.run": "onBuilt", // === CRITICAL: Force custom recipes === "latex-workshop.latex.recipe.default": "lastUsed", "latex-workshop.latex.recipes": [ { "name": "latexmk (lualatex)", "tools": ["lualatexmk"] }, { "name": "latexmk (pdflatex)", "tools": ["pdflatexmk"] }, { "name": "pdflatex ➞ bibtex ➞ pdflatex × 2", "tools": ["pdflatex", "bibtex", "pdflatex", "pdflatex"] } ], "latex-workshop.latex.tools": [ { "name": "lualatexmk", "command": "latexmk", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-lualatex", "-output-directory=%OUTDIR%", "%DOC%" ] }, { "name": "pdflatexmk", "command": "latexmk", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-pdf", "-output-directory=%OUTDIR%", "%DOC%" ] }, { "name": "pdflatex", "command": "pdflatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-output-directory=%OUTDIR%", "%DOC%" ] }, { "name": "bibtex", "command": "bibtex", "args": ["%DOCFILE%"] } ], // === CRITICAL FIX: Prevent files in root === "latex-workshop.latex.build.forceRecipeUsage": true, // === PDF Viewer === "latex-workshop.view.pdf.viewer": "tab", // === Formatting === "latex-workshop.formatting.latex": "latexindent", "latex-workshop.linting.chktex.enabled": true, // === IntelliSense === "latex-workshop.intellisense.package.enabled": true, "latex-workshop.intellisense.citation.backend": "bibtex" }
Critical Setting: "latex-workshop.latex.build.forceRecipeUsage": true
ensures auxiliary files go to build/
directory.
Recommended Project Structure
my-latex-project/ ├── .vscode/ │ └── settings.json # VS Code configuration ├── .gitignore # Exclude build files ├── main.tex # Main document ├── references.bib # Bibliography ├── sections/ # Document sections │ ├── introduction.tex │ ├── methodology.tex │ └── conclusion.tex ├── figures/ # Images and figures │ └── diagram.pdf └── build/ # Auto-generated files (ignored by git) ├── main.pdf ├── main.aux └── main.log
.gitignore
# Build directory build/ # LaTeX auxiliary files (if any escape to root) *.aux *.log *.out *.toc *.lof *.lot *.fls *.fdb_latexmk *.synctex.gz *.bbl *.blg *.bcf *.run.xml *.nav *.snm *.vrb # Editor files .vscode/ *.swp *~
Basic Document Template
% main.tex \documentclass[12pt,a4paper]{article} % Essential packages \usepackage[utf8]{inputenc} \usepackage[margin=1in]{geometry} \usepackage{graphicx} \usepackage{amsmath} \usepackage{hyperref} % Document information \title{Your Document Title} \author{Your Name} \date{\today} \begin{document} \maketitle \section{Introduction} Your content here. \end{document}
Two-Column Layout Template
% two_column.tex \documentclass[12pt, twocolumn]{article} % Essential packages \usepackage[margin=1in]{geometry} \usepackage{amsmath, amssymb, amsthm} \usepackage{graphicx} \usepackage{wrapfig} % Wrap text around figures \usepackage{parskip} % Better paragraph spacing \usepackage{xcolor} % Colors \usepackage{tikz} % Graphics and diagrams \title{Two-Column Document} \author{Your Name} \date{\today} \begin{document} \maketitle \section{Introduction} This document uses a two-column layout, common in academic papers and journals. The text flows naturally between columns. \subsection{Colored Text} You can add \textcolor{blue}{colored text} or \textcolor{red}{highlight important} information easily. \section{Figures in Two Columns} % Figure spanning one column \begin{figure}[htbp] \centering \includegraphics[width=0.9\linewidth]{image.pdf} \caption{Single column figure} \label{fig:single} \end{figure} % Figure spanning both columns \begin{figure*}[htbp] \centering \includegraphics[width=0.8\textwidth]{wide-image.pdf} \caption{Full-width figure spanning both columns} \label{fig:wide} \end{figure*} \section{TikZ Example} \begin{tikzpicture} \draw[thick,->] (0,0) -- (2,0) node[right] {$x$}; \draw[thick,->] (0,0) -- (0,2) node[above] {$y$}; \draw[blue,thick] (0,0) circle (1cm); \fill[red] (0,0) circle (2pt); \end{tikzpicture} \end{document}
LaTeX Command Cheat Sheet
Document Structure
\documentclass{article} % article, book, report, beamer \usepackage{packagename} % Include package \title{Title} \author{Name} \date{\today} \maketitle % Generate title \section{Section} % Numbered section \section*{Unnumbered Section} % Unnumbered \subsection{Subsection} \subsubsection{Subsubsection}
Text Formatting
\textbf{Bold} \textit{Italic} \underline{Underline} \texttt{Monospace} \emph{Emphasis} % Font sizes \tiny \small \normalsize \large \Large \LARGE \huge \Huge
Lists
% Unordered \begin{itemize} \item First \item Second \end{itemize} % Ordered \begin{enumerate} \item First \item Second \end{enumerate} % Description \begin{description} \item[Term] Definition \end{description}
Mathematics
% Inline math $E = mc^2$ % Display math \[ E = mc^2 \] % Numbered equation \begin{equation} E = mc^2 \end{equation} % Common symbols \alpha \beta \gamma \sum \int \frac{a}{b} \sqrt{x} x^2 x_i \leq \geq \neq \approx \infty
Figures
\begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{figures/image.pdf} \caption{Figure caption} \label{fig:label} \end{figure} % Reference: See Figure~\ref{fig:label}
Tables
\begin{table}[htbp] \centering \begin{tabular}{|l|c|r|} \hline Left & Center & Right \\ \hline Data & Data & Data \\ \hline \end{tabular} \caption{Table caption} \label{tab:label} \end{table}
Code Listings
% Inline code Use \texttt{print("Hello")} for output. % Basic code block \begin{verbatim} def hello(): print("Hello, World!") \end{verbatim} % Advanced with listings package \usepackage{listings} \usepackage{xcolor} % Configure style \lstset{ language=Python, basicstyle=\ttfamily\small, keywordstyle=\color{blue}, commentstyle=\color{gray}, stringstyle=\color{red}, numbers=left, numberstyle=\tiny\color{gray}, stepnumber=1, frame=single, breaklines=true, showstringspaces=false } % Use in document \begin{lstlisting} def fibonacci(n): """Calculate Fibonacci number""" if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) # Test function print(fibonacci(10)) \end{lstlisting} % Import from file \lstinputlisting[language=Python]{code/script.py} % Inline code with syntax highlighting \lstinline{x = [1, 2, 3]}
Citations & References
% In text \cite{key} \cite{key1,key2} % Bibliography \bibliographystyle{plain} \bibliography{references} % In references.bib: @article{key, author = {Author Name}, title = {Article Title}, journal = {Journal}, year = {2025} }
Essential Packages
% Page layout \usepackage[margin=1in]{geometry} % Graphics \usepackage{graphicx} \usepackage{wrapfig} % Wrap text around figures % Math \usepackage{amsmath,amssymb,amsthm} % Colors \usepackage{xcolor} % Typography \usepackage{parskip} % Better paragraph spacing % Hyperlinks \usepackage{hyperref} % Code listings \usepackage{listings} % Multiple columns \usepackage{multicol} % Graphics and diagrams \usepackage{tikz} % Create diagrams and graphics
Emoji Support
Setup for Emoji
Use LuaLaTeX engine (specify in VS Code or with magic comment):
% !TEX program = lualatex \documentclass{article} \usepackage{fontspec} \newfontfamily\emojifont{Noto Color Emoji}[Renderer=HarfBuzz] \newcommand{\emoji}[1]{{\emojifont #1}} \begin{document} Regular text with emoji: \emoji{😀 💖 🎉 ✅ 🚀} Math and emoji: The result is correct \emoji{✅} and $E=mc^2$ \end{document}
Multi-File Projects with Emoji
In main.tex
:
% !TEX program = lualatex \documentclass{article} \usepackage{fontspec} \newfontfamily\emojifont{Noto Color Emoji}[Renderer=HarfBuzz] \newcommand{\emoji}[1]{{\emojifont #1}} \begin{document} \input{sections/introduction} \end{document}
In sections/introduction.tex
:
\section{Introduction} Use emoji directly: \emoji{🌟}
Common Emoji Categories
% Status & Feedback \emoji{✅ ❌ ⚠️ ℹ️ ✓} % Math & Science \emoji{🔬 🧪 📊 📈 💡} % Actions \emoji{🎯 🚀 ⚡ 🔥 💪} % Academic \emoji{📚 📖 ✏️ 🎓 📝}
Essential Keyboard Shortcuts
Action | Shortcut | Description |
---|---|---|
Build Document | Ctrl+Alt+B | Compile LaTeX file |
View PDF | Ctrl+Alt+V | Open PDF preview |
Build & View | Ctrl+Alt+J | Compile and show PDF |
Clean Files | Ctrl+Alt+C | Remove auxiliary files |
Kill Process | Ctrl+Alt+K | Stop compilation |
SyncTeX Forward | Ctrl+Alt+J | Jump from source to PDF |
SyncTeX Backward | Ctrl+Click in PDF | Jump from PDF to source |
Common Issues & Solutions
1. Auxiliary Files in Root Directory
Problem: Files appear in project root instead of build/
folder.
Solution:
// Add to .vscode/settings.json "latex-workshop.latex.build.forceRecipeUsage": true
Then clean and rebuild:
rm *.aux *.log *.pdf *.synctex.gz 2>/dev/null # Reload VS Code (Ctrl+Shift+P → "Reload Window")
2. Emojis Not Rendering
Checklist:
- ✅ Using LuaLaTeX? Add
% !TEX program = lualatex
at top - ✅ Fonts installed? Run
fc-list | grep -i emoji
- ✅ Proper setup? Include fontspec and HarfBuzz renderer
- ✅ Using
\emoji{}
command for all emojis?
Quick fix:
sudo apt install fonts-noto-color-emoji fc-cache -fv
3. Build Fails with “Package not found”
Solution:
# Install missing package sudo apt install texlive-<package-name> # Or install everything sudo apt install texlive-full
4. PDF Not Updating
Solutions:
- Save file again (
Ctrl+S
) - Manual build (
Ctrl+Alt+B
) - Kill and rebuild (
Ctrl+Alt+K
, thenCtrl+Alt+B
) - Close PDF viewer and reopen
- Reload VS Code window
5. SyncTeX Not Working
Fix: Ensure -synctex=1
is in build args (already in config above)
6. Bibliography Not Appearing
Solution: Build sequence matters
# Run in order: pdflatex main.tex # First pass bibtex main # Process bibliography pdflatex main.tex # Second pass (add citations) pdflatex main.tex # Third pass (resolve references)
Or use recipe: “pdflatex ➞ bibtex ➞ pdflatex × 2”
7. Permission Denied Error
Solution:
# Check permissions ls -la build/ # Fix if needed chmod -R u+w build/
8. Font Cache Issues
Solution:
fc-cache -fv sudo fc-cache -fv # If above doesn't work
9. Memory Issues (Large Documents)
Solutions:
- Use
\include{}
instead of\input{}
for chapters - Compile individual chapters during editing
- Increase LaTeX memory in
texmf.cnf
(advanced)
10. Unicode/Special Characters Not Working
Solution: Use XeLaTeX or LuaLaTeX instead of pdfLaTeX:
% !TEX program = lualatex % or xelatex \usepackage{fontspec}
Changing Fonts
Using Sans Serif Fonts (Arial, Roboto, etc.)
With LuaLaTeX or XeLaTeX, you can use any system font:
% !TEX program = lualatex \documentclass{article} \usepackage{fontspec} % Set main font to sans serif \setmainfont{Arial} % or Roboto, Helvetica, etc. % Alternative: Use system fonts % \setmainfont{Liberation Sans} % Open-source Arial alternative % \setmainfont{Roboto} % Modern sans serif % Or just switch to Computer Modern Sans \renewcommand{\familydefault}{\sfdefault} \begin{document} This text will be in Arial (or your chosen font). \end{document}
With pdfLaTeX (limited options)
\documentclass{article} \usepackage[utf8]{inputenc} \renewcommand{\familydefault}{\sfdefault} % Use sans serif \usepackage{helvet} % Helvetica-like font \begin{document} Sans serif document with pdfLaTeX. \end{document}
Check Available Fonts
# List all installed fonts fc-list : family | sort | uniq # Search for specific font fc-list | grep -i arial fc-list | grep -i roboto
Quick Test Document
Create test.tex
to verify everything works:
% !TEX program = lualatex \documentclass{article} \usepackage{fontspec} \usepackage{amsmath} \usepackage{listings} \usepackage{xcolor} % Set custom fonts \setmainfont{Liberation Sans} % Sans serif main font (Arial-like) \setmonofont{Liberation Mono} % Monospace font \newfontfamily\emojifont{Noto Color Emoji}[Renderer=HarfBuzz] \newcommand{\emoji}[1]{{\emojifont #1}} % Configure code style \lstset{ basicstyle=\ttfamily\small, keywordstyle=\color{blue}\bfseries, commentstyle=\color{gray}\itshape, stringstyle=\color{red}, numbers=left, numberstyle=\tiny\color{gray}, frame=single, breaklines=true, showstringspaces=false } \begin{document} \title{LaTeX Test Document} \author{Test User} \date{\today} \maketitle \section{Text Formatting} \textbf{Bold}, \textit{italic}, and \texttt{monospace} text. This document uses Liberation Sans (sans serif font similar to Arial). \section{Mathematics} Inline math: $E = mc^2$ Display math: \[ \int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2} \] \section{Emoji Test} Status: \emoji{✅} Working! \emoji{🎉} \section{Lists} \begin{itemize} \item First item \item Second item \end{itemize} \section{Code Example} Inline code: \texttt{print("Hello")} Python code block: \begin{lstlisting}[language=Python] def calculate_sum(numbers): """Calculate sum of numbers""" total = 0 for num in numbers: total += num return total # Test function data = [1, 2, 3, 4, 5] result = calculate_sum(data) print(f"Sum: {result}") \end{lstlisting} \section{Font Comparison} % Switch between fonts {\fontspec{Liberation Serif} This is Liberation Serif (default serif).} {\fontspec{Liberation Sans} This is Liberation Sans (sans serif).} {\fontspec{Liberation Mono} This is Liberation Mono (monospace).} \end{document}
Build with Ctrl+Alt+B
or save to auto-build.
Useful Resources
- Official Documentation: LaTeX Project
- LaTeX Mathematical Symbols: Mathematical Symbols
- Package Search: CTAN
- Symbol Search: Detexify
- Table Generator: TablesGenerator
- LaTeX Workshop Docs: GitHub Wiki
- Stack Exchange: TeX.SE
Last updated: October 2025 | For Ubuntu ARM with TeX Live