You could use your own local tile server. Here is a complete walk-through how to set up a OpenTopoMap tile server:
You could also set up a local proxy server (with content caching). The initial access for a map area will still be slow but recurring requests will be faster since the proxy is local:
This answer to another question suggest:
You could mass-download their tiles with any suitable tool or script, but please ask them before for permission and rate-limits, see https://opentopomap.org/credits
https://gis.stackexchange.com/a/278212/21355
You could write a simple Python script downloading all tiles for your desired map area. However, as mentioned in bugmenot123's answer, please ask them before for permission and rate-limits.
Note: I missed the part about the slow internet connection in your question at first. Sorry. Just ignore the next part of this answer. I leave it in case it's helpful for someone else.
If you want to use it in Leaflet, you may be able to use one of their tile server:
https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png
Additional information and terms of use on their About page.
Here is an example using Leaflet with https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenTopoMap Leaflet Example</title>
<!-- test code / integrity attribute removed for readability -->
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: calc(100vh - 1rem);"></div>
<script>
const map = L.map('map')
.setView([44.6475, -63.580278], 11);
L.tileLayer('https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png', {
attribution: `Kartendaten: © OpenStreetMap-Mitwirkende, SRTM
| Kartendarstellung: © OpenTopoMap (CC-BY-SA)`
}).addTo(map);
</script>
</body>
</html>