I have this test code:
```latex
foo

\begin{equation}
  foo
\end{equation}

foo

$foo$

foo
```
I want to replace "foo" with "bar" everywhere but LaTeX math, so I have written these functions:
```lang-el
(defun test-a ()
  (interactive)
  (let ((isearch-filter-predicate 'skip-equation-env))

    (query-replace-regexp "foo"
                          "bar" nil (point-min) (point-max))))

(defun skip-equation-env (beg end)
  (catch 'skip-region
    (save-excursion
      (save-match-data
        (when (and (looking-back "\\\\begin{equation}\\([[:graph:] \n]+\\)")
		           (looking-at "\\([[:graph:] \n]+\\)\\\\end{equation}"))
	      (throw 'skip-region nil)))
      t)))

(defun test-b ()
  (interactive)
  (let ((isearch-filter-predicate 'skip-inline-math))

    (query-replace-regexp "foo"
                          "bar" nil (point-min) (point-max))))

(defun skip-inline-math (beg end)
  (catch 'skip-region
    (save-excursion
      (save-match-data
        (when (face-at-point beg 'tex-math)
	      (throw 'skip-region nil)))
      t)))
```
I have adapted `skip-equation-env` and `skip-inline-math` from another code to be fit to my case, so I'm not sure of all their lines.

I have tested these functions successfully, but I would like to know if there is a more suitable way to write them using `isearch-filter-predicate`. I am new to `isearch`.

I am not allowed to use `auctex`.