Bueno quizás sea tarde pero leí tu pregunta y tengo una respuesta, yo uso tu paginación en varias páginas aunque modifique algunas cosas, te pongo tu versión del código y luego el mio:
Primero las funciones:
Código PHP :
      public function paginar($actual, $total, $por_pagina, $enlace, $maxpags=0) {
      
         $total_paginas = ceil($total/$por_pagina); 
         $anterior = $actual - 1; 
         $posterior = $actual + 1; 
         $minimo = $maxpags ? max(1, $actual-ceil($maxpags/2)): 1; 
         $maximo = $maxpags ? min($total_paginas, $actual+floor($maxpags/2)): $total_paginas; 
         if ($actual>1){
            $texto = "<a href=\"$enlace$anterior$condicion\" class=\"numeros\">«</a> "; 
         }else{
            $texto = "<span class=\"activo\"><b>«</b></span>"; 
         }
         if ($minimo!=1){
            $texto.= "... "; 
         }
         for ($i=$minimo; $i<$actual; $i++){
            $texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> "; 
         }         
         $texto .= "<span class=\"activo\"><b>$actual</b></span>"; 
         
         for ($i=$actual+1; $i<=$maximo; $i++){
            $texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> "; 
         }         
         
         if ($maximo!=$total_paginas){
            $texto.= "... ";
         }
           
         if ($actual<$total_paginas){
            $texto .= "<a href=\"$enlace$posterior\" class=\"numeros\">»</a>"; 
         }else{
            $texto .= "<span class=\"activo\"><b>»</b></span>"; 
         }
         
         return $texto;          
      }
      
      public function totalpaginas($total, $por_pagina){
         $total_paginas = ceil($total/$por_pagina);
         return $total_paginas;
      }
      public function generarReporte($param="", $orden="", $reg="", $tampag=""){
         $query="select rpa.idanuncio, rpa.usuario, rpa.imagenprincipal, rpa.titulo, rpa.planta, rpa.dormitorios, rpa.precio, rpz.zona, rpa.tipo, rpa.metros2, rpa.preciom2, rpa.negociable, rpva.ventaalquiler, rpn.nuevoono, rpa.destacado, rpa.resumen, rpn.idestado, rpva.idestva from realpro_anuncio rpa, realpro_estado rpn, realpro_estva rpva, realpro_zona rpz where rpa.idestado=rpn.idestado and rpa.idestva=rpva.idestva and rpa.idzona=rpz.idzona";
         if($param!=""){
            $query.= "and rpva.idestva='".$param."'";
         }
         
         if($orden==""){
            $query.= " order by rpa.precio";
         }
         //if($reg!="" && $tampag!=""){
            $query.=" LIMIT ".$reg.", ".$tampag;
         //}
         $consulta=mysql_query($query);   
         return $consulta;
      }
      
      public function totalFilasReporte($param=""){
         $query="select count(rpa.idanuncio) from realpro_anuncio rpa, realpro_estado rpn, realpro_estva rpva, realpro_zona rpz where rpa.idestado=rpn.idestado and rpa.idestva=rpva.idestva and rpa.idzona=rpz.idzona";
         if($param!=""){
            $query.= "and rpva.idestva='".$param."'";
         }
         $consulta=mysql_query($query);   
         return $consulta;
      }
Luego los estilos que aplique:
Código HTML :
a.numeros{
   font-weight:bold;
   color:#000000;
   display:inline;
   text-decoration:none;
   background-color:#FFFFFF;
   border:groove 1px #000000;
   padding:2.5px;
   margin-right:1px;
   width:15px;
}
a.numeros:hover{
   color:#FFFFFF;
   background-color:#000000;
   text-decoration:none;
}
.activo{
   color:#0000FF;
   display:inline;
   text-decoration:none;
   background-color:#99CCCC;
   border:groove 1px #000000;
   padding:2.5px;
   margin-right:1px;
   width:15px;
}
Finalmente el código en la página implementada (reportes.php):
Código PHP :
<?php
   include "soporte.php";   
   if (!isset($_GET['pag'])){
      $pag = 1;
   }else{
      $pag = $_GET['pag'];
   } 
   $result = $fn->totalFilasReporte($param);
   list($total) = mysql_fetch_row($result);
   $tampag = 10;
   $reg1 = ($pag-1) * $tampag;      
   $query=$fn->generarReporte("","",$reg1, $tampag);
?>
Te muestro lo que hay en mi página de soporte basándome en patrones de diseño:
Código PHP :
<?php
   include "funciones/funciones.php";
   
   include "clases/conexion.php";   
   $cx=new Conexion;
   $cx->conectarDB();
   
   $fn=new Funciones;
        .
        .
        .
?>
Finalmente como llamo a la función paginar:
Código PHP :
<div align="left"><strong>Páginas </strong>
      <?php echo $fn->paginar($pag, $total, $tampag, "reportes.php?pag=");?>
    </div>
Me correo bien a nivel local espero te sirva, y esta es la versión modificada que sirve para que no aparezca tanto número en la paginación:
Código PHP :
      public function paginar($actual, $total, $por_pagina, $enlace) {
         $maximalista=28;
         //echo "TOTAL: ".$total."<p>";
         //echo "X PAGINA: ".$por_pagina."<p>";
         $totalpaginas = ceil($total/$por_pagina);
         if($totalpaginas<=$maximalista){$maximalista=($totalpaginas-1);}
         if($maximalista==0){$maximalista=1;}
         //echo "TOTAL PAGINAS: ".$totalpaginas."<p>";
         $anterior = $actual - 1;$posterior = $actual + 1;
         if ($actual>1){$texto = "<a href=\"$enlace$anterior\" class=\"numeros\">«</a> ";}else{$texto = "<span class=\"activo\"><b>«</b></span> ";}
         
         if($actual<=1){
            if($maximalista==1){$val1=1;}else{$val1=$maximalista+$actual;}
            if($totalpaginas<$val1){$val1=$totalpaginas;}
            for ($i=1; $i<=$val1; $i++){
               if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
            }
         }
         $entre2=ceil($maximalista/2);
         if($actual>1){
            if($actual>$maximalista){
               if($actual>=$totalpaginas){
                  //echo "p1<p>";
                  for ($i=($actual-$entre2); $i<=$actual; $i++){
                     if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
                  }   
               }else{
                  //echo "p2<p>";
                  if(($actual+$entre2)>=$totalpaginas){$val=$totalpaginas;}else{$val=$actual+$entre2;}
                  for ($i=($actual-$entre2); $i<=$val; $i++){
                     if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
                  }
               }
            }else{
               //echo "p3<p>";
               if(($actual-$entre2)<=0){$val=1;}else{$val=$actual-$entre2;}
               if(($actual+$entre2)>$totalpaginas){$val1=$totalpaginas;}else{$val1=$actual+$entre2;}
               if($actual<$maximalista){$val1=$maximalista;}
               for ($i=$val; $i<=$val1; $i++){
                  if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
               }
            }
         }         
         if ($actual<$totalpaginas){$texto .= "<a href=\"$enlace$posterior\" class=\"numeros\">»</a>";}else{$texto .= "<span class=\"activo\"><b>»</b></span>";}
         return $texto;
      }
      
      public function totalpaginas($total, $por_pagina){
         $total_paginas = ceil($total/$por_pagina);
         return $total_paginas;
      }Como te das cuenta en esta segunda no uso MAXPAG porque me parece innecesario, espero te sirva si todavía buscas una solución.
Atentamente,
Carlos Piñán.