textfilters)) { error ('Filter not enabled!'); } else { $filters = explode(',', $CFG->textfilters); if (array_search('filter/tex', $filters) === FALSE) { error ('Filter not enabled!'); } } require_once($CFG->libdir.'/filelib.php'); require_once($CFG->dirroot.'/filter/tex/lib.php'); require_once($CFG->dirroot.'/filter/tex/latex.php'); $action = optional_param('action', '', PARAM_ALPHA); $texexp = optional_param('tex', '', PARAM_RAW); require_login(); require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM), $USER->id); /// Required cap to run this. MDL-18552 $query = urldecode($_SERVER['QUERY_STRING']); error_reporting(E_ALL); $output = ''; // look up in cache if required if ($action=='ShowDB' or $action=='DeleteDB') { $md5 = md5($texexp); $texcache = get_record("cache_filters","filter","tex", "md5key", $md5); } // Action: Show DB Entry if ($action=='ShowDB') { if ($texcache) { $output = "DB cache_filters entry for $texexp\n"; $output .= "id = $texcache->id\n"; $output .= "filter = $texcache->filter\n"; $output .= "version = $texcache->version\n"; $output .= "md5key = $texcache->md5key\n"; $output .= "rawtext = $texcache->rawtext\n"; $output .= "timemodified = $texcache->timemodified\n"; } else { $output = "DB cache_filters entry for $texexp not found\n"; } } // Action: Delete DB Entry if ($action=='DeleteDB') { if ($texcache) { $output = "Deleting DB cache_filters entry for $texexp\n"; $result = delete_records("cache_filters","id",$texcache->id); if ($result) { $result = 1; } else { $result = 0; } $output .= "Number of records deleted = $result\n"; } else { $output = "Could not delete DB cache_filters entry for $texexp\nbecause it could not be found.\n"; } } // Action: Show Image if ($action=='ShowImageMimetex') { tex2image($texexp); } // Action: Check Slasharguments if ($action=='SlashArguments') { slasharguments($texexp); } // Action: Show Tex command line output if ($action=='ShowImageTex') { TexOutput($texexp, true); exit; } // Action: Show Tex command line output if ($action=='ShowOutputTex') { if (debugging()) { TexOutput($texexp); } else { echo "Can not output detailed information due to security concerns, please turn on debug mode first."; } exit; } if (!empty($action)) { outputText($output); } // nothing more to do if there was any action if (!empty($action)) { exit; } function outputText($texexp) { header("Content-type: text/html"); echo "
\n"; if ($texexp) { $texexp = str_replace('<', '<', $texexp); $texexp = str_replace('>', '>', $texexp); $texexp = str_replace('"', '"', $texexp); echo "$texexp\n\n"; } else { echo "No text output available\n\n"; } echo "\n"; } function tex2image($texexp, $return=false) { global $CFG; if (!$texexp) { echo 'No tex expresion specified'; return; } $image = md5($texexp) . ".gif"; $filetype = 'image/gif'; if (!file_exists("$CFG->dataroot/filter/tex")) { make_upload_directory("filter/tex"); } $pathname = "$CFG->dataroot/filter/tex/$image"; if (file_exists($pathname)) { unlink($pathname); } $texexp = '\Large '.$texexp; $commandpath = tex_filter_get_executable(true); $cmd = tex_filter_get_cmd($pathname, $texexp); system($cmd, $status); if ($return) { return $image; } if (file_exists($pathname)) { send_file($pathname, $image); } else if (debugging()) { $ecmd = "$cmd 2>&1"; echo `$ecmd` . "
base filename for expression is '$md5'
\n"; // temporary paths $tex = "$latex->temp_dir/$md5.tex"; $dvi = "$latex->temp_dir/$md5.dvi"; $ps = "$latex->temp_dir/$md5.ps"; $gif = "$latex->temp_dir/$md5.gif"; // put the expression as a file into the temp area $expression = stripslashes($expression); $expression = html_entity_decode($expression); $output .= "Processing TeX expression:
$expression\n"; $doc = $latex->construct_latex_document($expression); $fh = fopen($tex, 'w'); fputs($fh, $doc); fclose($fh); // cd to temp dir chdir($latex->temp_dir); // step 1: latex command $cmd = "$CFG->filter_tex_pathlatex --interaction=nonstopmode $tex"; $output .= execute($cmd); // step 2: dvips command $cmd = "$CFG->filter_tex_pathdvips -E $dvi -o $ps"; $output .= execute($cmd); // step 3: convert command $cmd = "$CFG->filter_tex_pathconvert -density 240 -trim $ps $gif "; $output .= execute($cmd); if (!$graphic) { echo($output); } else { send_file($gif, "$md5.gif"); } } function execute($cmd) { exec($cmd, $result, $code); $output = "
$ $cmd\n"; $lines = implode("\n", $result); $output .= "OUTPUT: $lines\n"; $output .= "RETURN CODE: $code\n\n"; return $output; } function slasharguments($texexp) { global $CFG; $admin = $CFG->wwwroot.'/'.$CFG->admin.'/settings.php?section=http'; $image = tex2image($texexp,true); echo "
If the following image displays correctly, set your "; echo "Administration->Server->HTTP "; echo "setting for slasharguments to file.php/1/pic.jpg: "; echo "wwwroot/filter/tex/pix.php/$image\" align=\"absmiddle\">
\n"; echo "Otherwise set it to file.php?file=/1/pic.jpg "; echo "It should display correctly as "; echo "wwwroot/filter/tex/pix.php?file=$image\" align=\"absmiddle\">
\n"; echo "If neither equation image displays correctly, please seek "; echo "further help at moodle.org at the "; echo ""; echo "Mathematics Tools Forum
"; } ?>Please enter an algebraic expression without any surrounding $$ into the text box below. (Click here for help.)
First a brief overview of how the TeX filter works. The TeX filter first searches the database cache_filters table to see if this TeX expression had been processed before. If not, it adds a DB entry for that expression. It then replaces the TeX expression by an <img src=".../filter/tex/pix.php..."> tag. The filter/tex/pix.php script then searches the database to find an appropriate gif image file for that expression and to create one if it doesn't exist. It will then use either the LaTex/Ghostscript renderer (using external executables on your system) or the bundled Mimetex executable. The full Latex/Ghostscript renderer produces better results and is tried first. Here are a few common things that can go wrong and some suggestions on how you might try to fix them.