Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ jobs:
$v = (Select-String -Path Cargo.toml -Pattern '^version = "(.*)"').Matches[0].Groups[1].Value
$p = "TeXora-$v-windows-x64"
New-Item -ItemType Directory -Force "stage/$p", "dist/$v" | Out-Null
Copy-Item target/release/TeXora.exe, target/release/pdfium.dll, README.md, CREDITS.md, LICENSE "stage/$p/"
Copy-Item target/release/TeXora.exe, target/release/pdfium.dll, README.md, CREDITS.md, THIRD-PARTY-LICENSES.md, LICENSE "stage/$p/"
Compress-Archive -Path "stage/$p" -DestinationPath "dist/$v/$p.zip"
"PKG=$p" | Out-File -Append $env:GITHUB_ENV
"VER=$v" | Out-File -Append $env:GITHUB_ENV
Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,31 @@

All notable changes to TeXora. The newest version is first.

## 1.5.0

### Security

- ffmpeg opens a clip with `-nostdin -protocol_whitelist file` and a list of real video formats only, so a file that is really a playlist or a concat list cannot make ffmpeg read other files or web addresses. Tested with such files: plain ffmpeg follows them, TeXora's ffmpeg refuses them.
- VLC gets the clip's full path after `--`, so a file name starting with `-` is never read as an option, and only files that really are videos (from their first bytes, not their name): never a playlist.
- Which player runs, and where it is, comes only from your own Settings. A presentation, its `.tex` file, a PDF or anything in its folder can never set the program or add arguments; this is tested.

### New

- Videos and GIFs in your slides: `\usepackage{texoravideo}` and `\includevideo[width=0.5\textwidth]{clip.mp4}`. TeXora ships the LaTeX package and finds it by itself when it compiles. A second optional argument takes `autoplay`, `loop`, `posterat=<percent>` and `poster=<image>`.
- **GIFs play by themselves.** **MP4 playback uses VLC or ffmpeg installed on your computer**: with ffmpeg the clip plays inside the slide, with VLC in VLC's own window. TeXora contains no video decoder and never downloads or installs one.
- Settings > Video chooses the player (Auto, ffmpeg, VLC or Off), with a path and a **Test** button for each.
- A video that needs a player when none is installed says "This video needs VLC or ffmpeg installed on your computer.", with **Get VLC**, **Get ffmpeg** and **Copy install command**. TeXora only opens the pages and copies the command; it never runs it.
- Before compiling, TeXora makes each clip's poster in a `texora-video` folder (again only when the clip changes; a video's poster needs ffmpeg), so every PDF viewer shows the poster; a click in TeXora plays or pauses the clip, and another slide stops it and its ffmpeg.
- A missing file, a file that is not a video or a path outside the presentation's folder shows a message over the poster and under Problems.
- A video can be in the `.tex` file's folder or in any folder inside it; a video in a folder is written with the folder name, as in `\includevideo{videos/clip.mp4}`. "Video not found" says this in plain words.
- One poster per video, however often it is used; posters no longer used are removed.
- A new template, **Video Guide**, explains `\includevideo` slide by slide: what you need, a video, a looping GIF, every option, posters, overlays and what to do when a clip does not play. Its sample video and GIF are saved in a `media` folder beside the new file.

### Fixed

- Check packages finds packages, classes, themes and TikZ libraries of your own that sit beside the `.tex` file (or in a folder you name, as in `\usepackage{styles/house}`), as LaTeX does, and no longer reports them as missing or suggests `tlmgr install` for them (#3).
- The control bar under an animation (first, previous, play/pause, next, last) works again: its buttons now get the click, instead of the slide underneath taking it.

## 1.4.1

### Fixed
Expand Down
4 changes: 4 additions & 0 deletions CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ TeXora is original code by Khalid Alkhaldi, licensed under PolyForm Noncommercia
bundled sample lecture and the five presentation templates are neutral placeholder text written for it.

- PDFium, prebuilt by bblanchon/pdfium-binaries: BSD-3-Clause and Apache-2.0. Downloaded into `vendor/` when building.
- md-5 (names video posters): MIT or Apache-2.0. GIFs are decoded by the image crate.
- No video decoder, ffmpeg, VLC, libvlc or codec library is included. MP4 playback uses VLC or ffmpeg
installed on your computer, started as separate programs. Every library inside TeXora, with its
licence, is listed in `THIRD-PARTY-LICENSES.md`.
- egui and eframe: MIT or Apache-2.0.
- pdfium-render: MIT or Apache-2.0.
- ureq, serde, serde_json, image, rfd, display-info, dirs: MIT or Apache-2.0 style licences.
Expand Down
81 changes: 80 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "texora"
version = "1.4.1"
version = "1.5.0"
edition = "2021"
description = "TeXora: a LaTeX-native presenter for Beamer and PDF slides"
license = "PolyForm-Noncommercial-1.0.0"
Expand All @@ -15,7 +15,7 @@ path = "src/main.rs"
eframe = { version = "0.37", default-features = false, features = ["glow", "default_fonts", "wayland", "x11", "clipboard", "links", "system_fonts"] }
egui = "0.37"
pdfium-render = "0.9.5"
image = { version = "0.25", default-features = false, features = ["png"] }
image = { version = "0.25", default-features = false, features = ["png", "gif", "jpeg"] }
rfd = "0.17"
serde = { version = "1", features = ["derive"] }
unicode-bidi = "0.3"
Expand All @@ -24,6 +24,10 @@ serde_json = "1"
ureq = { version = "3", features = ["json"] }
display-info = "0.5"
dirs = "7"
# Video inside slides: GIFs are decoded by the image crate. TeXora contains no other video decoder;
# MP4 and other formats play through ffmpeg or VLC that the person installed (src/video.rs). md-5 names
# the posters.
md-5 = "0.11"

# Fonts for other writing systems (Arabic, Hebrew, Chinese, Japanese, Korean, Hindi, Thai...) come from
# the computer itself. On Linux, fontconfig is opened when the program runs instead of being linked, so
Expand Down
60 changes: 51 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ The audience window shows only the slide, fullscreen on a projector or second sc
source, from a `.pdfpc` file, or from a Markdown file beside the presentation. **Edit notes** for any
slide right in the notes panel.
- **Animations and videos**: animations made with the LaTeX `animate` package play on the slide, with
autoplay, looping and play controls; video clips open in your video player.
autoplay, looping and play controls. Videos and GIFs placed with the built-in `texoravideo` package
play inside the slide; `\movie` and media9 clips open in your video player.
- **Drawing and pointing**: pen, highlighter, eraser, a laser pointer in several colours, and zoom into
an area. Ink is kept per slide.
- **Zoom** any slide with the wheel or a pinch, around the pointer.
Expand Down Expand Up @@ -128,11 +129,13 @@ Nothing else is needed to present PDFs: each package carries the program and its
LaTeX project**, pick a recent file, or drop a file on the window. **Try the sample lecture** opens
a ready-made talk to explore.

**New LaTeX presentation** offers eight templates, each a complete Beamer file with speaker notes:
Classic Green, Midnight, Minimal White, Conference and Sunrise, and three animated ones. **Motion
**New LaTeX presentation** offers nine templates, each a complete Beamer file with speaker notes:
Classic Green, Midnight, Minimal White, Conference and Sunrise, and four animated ones. **Motion
Lab** shows animations drawn with TikZ, **Flipbook** plays the frames of a GIF and charts that
grow, and **Media Studio** has a video clip and charts that draw themselves. Flipbook and Media
Studio save their pictures and clip in a `media` folder beside the new file.
grow, **Media Studio** has a video clip and charts that draw themselves, and **Video Guide**
explains `\includevideo` slide by slide, with a video and a GIF that play inside the slides.
Flipbook, Media Studio and Video Guide save their pictures and clips in a `media` folder beside
the new file.
3. A `.tex` file is compiled for you. Edit it in the **LaTeX studio** (Cmd/Ctrl+E), or in your own
LaTeX editor: the slides rebuild either way.
4. Press **F5** to show the slides to the room, then move with the arrow keys or **Space**.
Expand Down Expand Up @@ -358,7 +361,48 @@ For a large GIF, shrink it while splitting, for example
`ffmpeg -i anim.gif -vf "fps=10,scale=640:-1" frames/f%d.png`, and keep the `frames` folder beside
the `.tex` file.

**Videos.** Use Beamer's `\movie` (the `multimedia` package) or media9's `\includemedia`. Each shows a
**Videos inside the slide.** TeXora comes with its own LaTeX package, `texoravideo`, and finds it by
itself when it compiles; there is no package to install or copy. **GIFs play by themselves. MP4
playback uses VLC or ffmpeg installed on your computer**: with ffmpeg the clip plays inside the slide,
with VLC in VLC's own window. TeXora contains no video decoder and never downloads or installs one.

```latex
\usepackage{texoravideo}
\hypersetup{hidelinks}
...
\includevideo[width=0.5\textwidth]{clip.mp4}
\includevideo[height=5cm][loop,autoplay]{media/wave.gif}
\includevideo[width=\textwidth][poster=cover.png,posterat=25]{talk.mp4}
```

- The first optional argument goes to `\includegraphics` as it is. The second takes `autoplay`, `loop`,
`posterat=<percent>` (where the poster is taken from; default the first frame) and `poster=<image>`.
- The video must be in the `.tex` file's folder, or in a folder inside it (any name). If it is in a
folder, write the folder name too: `{videos/clip.mp4}`. Otherwise TeXora shows "Video not found".
- Before LaTeX runs, TeXora makes one poster per video in a `texora-video` folder beside the
presentation, again only when the clip changes; if a video is used with different `posterat`
values, the first counts. `texora-video/index.json` keeps what was found, so the
PDF still plays when opened later. Every PDF viewer shows the poster; only TeXora plays the clip.
- Click to play, click again to pause; another slide stops it, and overlay steps of the same slide keep
it playing. GIFs work the same way, with no splitting.
- GIFs always play. MP4 and other formats play when ffmpeg or VLC is installed; ffmpeg also makes
their posters. Choose the player in **Settings > Video** (Auto, ffmpeg, VLC or Off); each has a path
field and a **Test** button.
- No player installed: the clip says "This video needs VLC or ffmpeg installed on your computer.", with
**Get VLC** (videolan.org), **Get ffmpeg** (ffmpeg.org/download.html) and, on macOS and Linux,
**Copy install command** (`brew install ffmpeg`, or `sudo apt install ffmpeg`). TeXora copies the
command; you run it yourself.
- A missing file, a file that is not a video, or a path outside the presentation's folder (an absolute
path, `..`, a link leading out, a web address) shows a message over the poster and under Problems.
Names may have spaces and accents, but not `%` or `#`.
- ffmpeg and VLC run as separate programs, with a list of arguments and never through a shell; TeXora
ends ffmpeg when you leave the slide. Sound is not played yet.
- ffmpeg reads a clip with `-nostdin -protocol_whitelist file` and real video formats only, so a file
that is really a playlist or concat list cannot reach other files or the web. VLC gets the full path
after `--`, and only real video files. Which program runs comes only from your Settings: a
presentation or anything in its folder can never set it or add arguments.

**Videos in your video player.** Use Beamer's `\movie` (the `multimedia` package) or media9's `\includemedia`. Each shows a
play button in the presenter view. Click it and the video opens in your computer's video player,
which you can move to the projector. The player may start paused, so press play there.

Expand All @@ -374,7 +418,7 @@ which you can move to the projector. The player may start paused, so press play
unpacked by TeXora.
- Write `\movie` without `externalviewer`. `\movie[externalviewer]` and `\href{run:...}` links are not
opened yet, and links to local files (`\href{file:...}`) are not opened.
- Videos do not play inside the slide itself.
- These clips do not play inside the slide; use `\includevideo` for that.

### Presenting to the room

Expand Down Expand Up @@ -487,5 +531,3 @@ Copyright 2026 Khalid Alkhaldi. Licensed under [PolyForm Noncommercial 1.0.0](LI
non-commercial purpose, including personal use, study, teaching, research and non-profit work. Commercial
use needs the author's permission. The app icon and Home picture are the author's artwork and are not
covered by the licence. See [CREDITS.md](CREDITS.md) for the libraries and fonts used.

Made by Khalid Alkhaldi.
Loading
Loading