It is easy to turn solutions to exercises on or off by the options
--without_solutions
(for !bsol
environments) and --without_answers
(for !bans
environments). One often wants to publish a book
without solutions to exercises, but also make versions with solutions.
One possibility is to password protect the versions with solutions.
It can be wise to create a very complicated filename for the files that may be shown in a browser with the URL visible for a class. One possibility is to create a 40 long SHA1 string as filename and start it with a dot to also make it invisible in most operating systems.
hash=82dee82e1274a586571086dca04d00308d3a0d86
html=.trash<built-in function hash>
doconce format html book --html_output=$html ...
The file following file, called password.html
, presents an empty page
with a button for providing a password, and if approved, the first
page of the book opens up.
<html>
<body>
<!-- password protected HTML page --->
<script>
function passWord() {
var testV = 1;
var pass1 = prompt('Please enter your password',' ');
while (testV < 3) {
if (!pass1)
history.go(-1);
if (pass1.toLowerCase() == "PASSWORD") {
alert('You Got it Right!');
window.open('DESTINATION.html');
break;
}
testV += 1;
var pass1 =
prompt('Access denied - password incorrect!', 'Password');
}
if (pass1.toLowerCase()!="password" & testV ==3)
history.go(-1);
return " ";
}
</script>
<center>
<form>
<input type="button" value="Enter Protected Area" onClick="passWord()">
</form>
</center>
</body>
</html>
Suppose your HTML file with solutions that you want to password protect has the
name book-sol.html
. Then you can simply do
cp password.html book-sol.html
doconce replace DESTINATION "$html" book-sol.html
doconce replace PASSWORD "s!m!art|pass@word" book-sol.html
A PDF file can easily be password protected with the use of the pdftk
tool. If book.pdf
is with solutions, book-sol.pdf
will also require
a password a!4
:
pdftk book.pdf output book-sol.pdf owner_pw foo user_pw "a!4"
The primary repository organization described in this document has the
DocOnce source files in doc/src
, while compiled and published
documents appear in doc/pub
. If the book is published without
solutions to exercises, one will often avoid readers to dive into the
DocOnce source files in the repository and find solutions. The author
has two methods for dealing with this problem.
The first method is simple, but not safe. The idea is to rename
doc/src
to doc/.src
. That is, the source tree has a name starting
with a dot (.src
) such that the directory is invisible on Unix
systems. However, it is visible on GitHub, and any ls -a
command
will list the source tree. A reader who really wants to find solutions
in the DocOnce source files will most likely locate the files...
Another, completely safe method is to move the .src
or src
directory tree to a new, private repository when the book is to be published.
The make*
scripts must then the updated such that the directory
where the documents are published becomes correct.
One can also start out with a private repository for the source files and a public repository for the published files. This author, however, prefers to use one repository when developing major parts of a book and then migrate the source tree to a private repository when solutions are to be protected from the public.